我有一个固定大小为 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);
它会打印得很好。为什么是这样?
正如 LPL 在评论中提到的,这是必需的,因为 WPF 需要执行所有数据绑定。由于 WPF 操作在Dispatcher
,您需要将打印操作排队以在之后完成DispatcherPriority.DataBind
。因此,调用BeginInvoke
with DispatcherPriority.Render
或更低将使 WPF 有时间处理控件上的绑定,以便它们显示在打印输出中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)