Моментальные снимки управления во времени с использованием VisualBrush, сохраненные в одном фиксированном (потоковом) документе

#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. Я использую его, но очень медленно.