手动加载框架元素

时间:2014-02-28 00:22:58

标签: c# .net wpf

我已经构建了一个模板化打印系统,它使用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事件,并且永远不会进入加载状态。我只是碰到了一个障碍,这已经成为一个问题,我的黑客不再有效。

有没有办法手动触发元素及其所有子元素的正确加载?

1 个答案:

答案 0 :(得分:0)

我已经从两个角度解决了这个问题。

首先,不要直接加载元素。使用ContentControl,它似乎可以更好地处理实例化模板并解决许多深层数据绑定问题:

new ContentControl
{
    Content = item,
    ContentTemplate = template
}

接下来,允许空闲队列进行处理。这会强制运行各种延迟任务,WPF通常会在您的窗口空闲时排队等候:

FrameworkElement element = ...;
element.Dispatcher.BeginInvoke(() => {}, DispatcherPriority.SystemIdle);