我已经构建了一个模板化打印系统,它使用XAML通过WPF CreateVisualsCollator()
创建XPS文档:
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!
}
我正在做没有存在用户界面 - 这实际上是用于Windows服务。
我一直在做黑客,比如手动调用UpdateLayout()
来执行大小调整,并且已经意识到我必须这样做的原因是控件永远不会触发他们的Loaded
事件,并且永远不会进入加载状态。我只是碰到了一个障碍,这已经成为一个问题,我的黑客不再有效。
有没有办法手动触发元素及其所有子元素的正确加载?
答案 0 :(得分:0)
我已经从两个角度解决了这个问题。
首先,不要直接加载元素。使用ContentControl,它似乎可以更好地处理实例化模板并解决许多深层数据绑定问题:
new ContentControl
{
Content = item,
ContentTemplate = template
}
接下来,允许空闲队列进行处理。这会强制运行各种延迟任务,WPF通常会在您的窗口空闲时排队等候:
FrameworkElement element = ...;
element.Dispatcher.BeginInvoke(() => {}, DispatcherPriority.SystemIdle);