2
我有一個固定尺寸爲850x1100的UserControl,可以爲我提供與Letter尺寸紙張相同的寬高比。我在Viewbox
的窗口中顯示了它,它很像打印預覽。該控件繼承我的窗口的DataContext,當它顯示在屏幕上時,所有的綁定工作,它看起來很棒。爲什麼我需要調用Dispatcher.BeginInvoke()以允許視覺在打印前正確綁定?
我在後面的代碼中寫了下面的代碼(我覺得它完全是面向視圖的操作)來嘗試打印它。如果我按照書面形式執行此代碼,則控件將打印,但不會顯示爲數據綁定。
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);
將打印就好了。爲什麼是這樣?
我猜'帶Loaded'(枚舉值6)或更低的所有[DispatcherPriority](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx)將工作。我認爲使用默認的「DispatcherPriority.Normal」頁面佈局還沒有準備好。 – LPL
您也可以嘗試強制使用page.UpdateLayout()而不是page.Measure和page.Arrange。 (不能測試它,但有一次類似的問題)。 您的原始PrintVisual調用不能正常工作,因爲UI尚未更新(WPF異步工作)。通過使用Invoke,您的調用在UI更新(應用程序再次空閒時)後排隊並執行,這就是爲什麼它正在工作。 – SvenG
您是什麼意思,「看起來不是數據綁定」? –