2013-08-07 37 views
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); 

將打印就好了。爲什麼是這樣?

+3

我猜'帶Loaded'(枚舉值6)或更低的所有[DispatcherPriority](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx)將工作。我認爲使用默認的「DispatcherPriority.Normal」頁面佈局還沒有準備好。 – LPL

+0

您也可以嘗試強制使用page.UpdateLayout()而不是page.Measure和page.Arrange。 (不能測試它,但有一次類似的問題)。 您的原始PrintVisual調用不能正常工作,因爲UI尚未更新(WPF異步工作)。通過使用Invoke,您的調用在UI更新(應用程序再次空閒時)後排隊並執行,這就是爲什麼它正在工作。 – SvenG

+0

您是什麼意思,「看起來不是數據綁定」? –

回答

3

正如LPL在註釋中提到的那樣,這是必需的,因爲WPF需要執行所有的數據綁定。由於WPF操作在Dispatcher上排隊,因此您需要在DispatcherPriority.DataBind之後排列打印操作以完成操作。因此,調用BeginInvokeDispatcherPriority.Render或更低版本將給予WPF時間來處理控件上的綁定,因此它們會顯示在您的打印輸出中。

相關問題