我有一个固定大小为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);
它打印就好了。这是为什么?
答案 0 :(得分:3)
正如LPL在评论中所提到的,这是必需的,因为WPF需要执行所有数据绑定。由于WPF操作在Dispatcher
上排队,因此您需要在DispatcherPriority.DataBind
之后将打印操作排队。因此,使用BeginInvoke
或更低版本调用DispatcherPriority.Render
将使WPF有时间处理控件上的绑定,因此它们会显示在您的打印输出中。