为什么我需要调用Dispatcher.BeginInvoke()以允许视觉在打印前正确绑定?

时间:2013-08-07 12:32:59

标签: wpf data-binding printing dispatcher

我有一个固定大小为850x1100的UserControl,可以提供与信纸大小相同的宽高比。我在Viewbox内的窗口中显示它,它的作用就像打印预览一样。控件继承了我的窗口的DataContext,当它显示在屏幕上时,所有绑定都起作用,看起来很棒。

我已经在我的窗口代码中编写了下面的代码(我觉得这是一个完全面向视图的操作)来尝试打印它。如果我按照写入的方式执行此代码,则控件将打印,但似乎不是数据绑定。

private void PrintButton_Click(object sender, RoutedEventArgs e) {
    var dlg = new PrintDialog();
    var result = dlg.ShowDialog();
    if (result == null || !(bool)result)
        return;

    var page = new InspectionFormPrintView { DataContext = this.DataContext };

    page.Measure(new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight));
    page.Arrange(new Rect(new Point(0, 0), page.DesiredSize));

    dlg.PrintVisual(page, "Inspection Form");
}

如果我将该方法中的最后一行修改为

Dispatcher.BeginInvoke(new Action(() => dlg.PrintVisual(page, "Inspection Form")), DispatcherPriority.ApplicationIdle, null);
它打印就好了。这是为什么?

1 个答案:

答案 0 :(得分:3)

正如LPL在评论中所提到的,这是必需的,因为WPF需要执行所有数据绑定。由于WPF操作在Dispatcher上排队,因此您需要在DispatcherPriority.DataBind之后将打印操作排队。因此,使用BeginInvoke或更低版本调用DispatcherPriority.Render将使WPF有时间处理控件上的绑定,因此它们会显示在您的打印输出中。

相关问题