2016-03-28 57 views
0

的應用與嵌入在ScrollViewer中的A4頁面大小的畫布:上畫布的看不見的部分,不能打印

<ScrollViewer > 
    <Canvas Name="PageCanvas" Width="21cm" Height="29.7cm"> 

這工作得很好。現在,當用戶想打印,應用程序做到這一點:

PrintDialog dlg = new System.Windows.Controls.PrintDialog(); 
if (dlg.ShowDialog() == true) 
    dlg.PrintVisual(this.PageCanvas, "Document"); 

問題:打印輸出始終只與畫布的可見部分開始。

所以,當你向下滾動,在畫布上的頂部看不見的部分是在打印輸出上不可見

然而,這很奇怪,在畫布的底部看不見的部分是始終在打印輸出上可見

那麼這裏有什麼問題?

+0

根據[本文](https://social.msdn.microsoft.com/Forums/vstudio/en-US/be2edad6-f075-4295-ab22-3657eba78043/how-to-print-the-entire-這是在MSDN上的一個wpf-window-that-scroll-forum = wpf),你可以設置代碼在打印前將滾動條移動到頂部。 – Tofystedeth

+0

@Tofystedeth啊是的。那麼這當然是一個簡單的解決方案,沒有想到這一點;)在我眼中有點「笨拙」,但很好,重要的是它的工作原理。發佈它作爲答案,然後我可以upvote它! –

回答

2

對此,我找到了一個解決方法,我發現here on MSDN只是在調用代碼打印之前將scrollviewer設置回頂端。

如果你想要一些不太冒昧的東西,我幾年前在一個項目中工作,在那裏我爲數據作爲帶綁定的XAML窗口布置了一個模板,然後將窗口變成了FixedDoc,然後可以直接打印,或者轉換成xps文件以便稍後進行批量打印。轉換看起來像這樣。

private FixedDocument ConvertToDoc(DocInfo pageData) 
    { 
     FixedDocument fixedDoc = new FixedDocument(); 
     PageContent content = new PageContent(); 
     FixedPage page = new FixedPage(); 
     DocTemplate printTemplate = new DocTemplate(pageData); 
     page.Children.Add(printTemplate); 
     ((System.Windows.Markup.IAddChild)content).AddChild(page); 
     fixedDoc.Pages.Add(content); 
     return fixedDoc; 
    } 

其中DocTemplate是我佈局的xaml頁面,pageData是它綁定到的模型對象。你可以用畫布做類似的事情。