#wpf #snapshot #visualbrush
#wpf #моментальный снимок #visualbrush
Вопрос:
Мне нужно сделать моментальные снимки элемента управления во времени и сохранить их в одном FixedDocument. Проблема в том, что VisualBrush каким-то образом «ленив» и не оценивает себя, добавляя его в документ. Когда я окончательно создаю документ, все страницы содержат одно и то же (последнее) состояние управления. Хотя VisualBrush нельзя заморозить, есть ли другой шанс сделать это? Я хотел бы иметь больше снимков на одной странице, поэтому создание документа постранично не является решением для меня. Также, как преобразование VisualBrush в Bitmap (я хочу сохранить его в векторах). Короче говоря — I need to somehow Freeze() VisualBrush
for(;;)
{
FixedPage page = new FixedPage();
...
Rectangle rec = new Rectangle();
...
rec.Fill = vb;
page.Children.Add(rec);
PageContent content = new PageContent();
((IAddChild)content).AddChild(page);
doc.Pages.Add(content);
}
Ответ №1:
Я использовал сериализацию:
string svb = XamlWriter.Save(vb.CloneCurrentValue());
// Replace all "Name" attributes (I don't need them already and deserialization would crash on them) with "Tag" - not best practice but it's fast :)
svb = svb.Replace("Name", "Tag");
rect.Fill((VisualBrush)XamlReader.Parse(svb));
Редактировать
Лучший способ — сохранить Visual как документ XPS, а затем вернуть Visual обратно. (Де) сериализация имеет некоторые проблемы с SharedSizeGroups и многими другими «ссылочными» вещами.
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
control.InvalidateArrange();
UpdateLayout();
writer.Write(control);
Visual capture = doc.GetFixedDocumentSequence().DocumentPaginator.GetPage(0).Visual;
Комментарии:
1. Я использую его, но очень медленно.