我需要及时拍摄Control的快照并将其存储在一个FixedDocument中。问题在于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);
}
最佳答案
我使用了序列化:
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;