Снимки контроля во времени с использованием VisualBrush, хранящиеся в одном фиксированном (потоке) документе - PullRequest
4 голосов
/ 07 ноября 2011

Мне нужно вовремя сделать снимки элемента управления и сохранить их в одном фиксированном документе.Проблема в том, что VisualBrush почему-то «ленив» и не оценивает себя, добавляя его в документ.Когда я окончательно создаю документ, все страницы содержат одинаковое (последнее) состояние Control.Хотя VisualBrush не может быть заморожен, есть ли другой шанс сделать это?Мне бы хотелось, чтобы на одной странице было больше снимков, поэтому создание документа страница за страницей не является для меня решением.Также как и преобразование VisualBrush в растровое изображение (я хочу сохранить его в векторах).Короче говоря - 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 Ответ

4 голосов
/ 08 ноября 2011

Я использовал сериализацию:

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));

EDIT

Лучший способ - сохранить документ Visual в формате XPS, а затем вернуть файл Visual обратно. (Де) сериализация имеет некоторые проблемы с SharedSizeGroups и многими другими "ссылочными" вещами.

XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
control.InvalidateArrange();
UpdateLayout();
writer.Write(control);
Visual capture = doc.GetFixedDocumentSequence().DocumentPaginator.GetPage(0).Visual;
...