我已经建立了一个模板化的打印系统,该系统可以通过WPF使用XAML创建XPS文档CreateVisualsCollator()
:
FrameworkElement fe = ...;
using (Package p = Package.Open(...))
using (XpsDocument doc = new XpsDocument(p))
{
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
SerializerWriterCollator col = writer.CreateVisualsCollator();
Size size = new Size(page size...)
fe.Measure(size);
fe.Arrange(new Rect(size));
fe.UpdateLayout();
col.Write(fe);
// fe.IsLoaded is still false here!
}
我这样做是在没有UI的情况下进行的-实际上,这是针对Windows服务的。
我一直在做一些黑客UpdateLayout()
操作,例如手动调用执行大小调整,并且意识到我这样做的原因是控件永远不会Loaded
触发事件,也永远不会进入加载状态。我刚刚遇到了一个麻烦,这已经成为一个问题,而且我的hack也不再起作用。
有没有一种方法可以为元素及其所有子元素手动触发适当的加载?
我已经从两个角度对此进行了攻击。
首先,不要直接加载您的元素。使用ContentControl,似乎可以更好地实例化模板并解决许多深度数据绑定问题:
new ContentControl
{
Content = item,
ContentTemplate = template
}
接下来,允许空闲队列进行处理。这将强制运行各种延迟的任务,而WPF通常在窗口空闲时将这些任务排队等待:
FrameworkElement element = ...;
element.Dispatcher.BeginInvoke(() => {}, DispatcherPriority.SystemIdle);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句