2

我有一个固定大小为 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);

它会打印得很好。为什么是这样?

4

1 回答 1

3

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

于 2013-08-07T19:06:39.080 回答