2013-04-22 47 views
1

所以我一直在構建一個WPF應用程序,它可以打印一些表單。這些表格只預印有空格,您應該在這些空格中填入某些信息。 WPF應用程序需要精確地打印文本,以便WPF打印的文本與預先打印格式的文本和空白完全對齊。通過使用DocumentViewer和FixedDocument,我能夠在很大程度上完成任務。如何隱藏DocumentViewer頁面元素打印

由於某種原因,VS WPF設計人員不喜歡將PageContent放入到DocumentViewer的FixedDocument中,即使您可以將PageContent放在任何其他容器(如滾動查看器)中,它也會得到完美呈現。但即使VS XAML解析器不能正常工作,我也可以編譯並運行我的應用程序,而不會出現任何問題。

另一方面的問題來自我無法找到一種方法來隱藏打印的FixedDocument中的某些元素。爲了讓用戶更加精確地將信息輸入到應用程序中,並且要知道打印表單中的位置,我將該信息放置在FixedDocument的背景中。但是我只希望當用戶在DocumentViewer中查看文檔時顯示它,我不想在按下打印按鈕時打印該圖像。

現在在Windows窗體中,我可以處理OnPrint事件並使用IsPrintPreview屬性,我可以決定打印什麼和不打印什麼。另一方面,DocumentViewer看起來不允許我決定要打印什麼和不打印什麼。

Soooo,長話短說,有沒有辦法在DocumentViewer中打印FixedDocument中的某些控件?

回答

1

我「解決了」這個問題。那麼對於certan的解決方案的定義。 以供將來參考我所做的是通過附加我自己的打印命令覆蓋的DocumentViewer自帶的打印代碼:

<DocumentViewer.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Print" Executed="PrintExecute"/> 
</DocumentViewer.CommandBindings> 

,比我的代碼會隱藏文檔中的事情,我不想打印,顯示對話框,並使用XPSDocumentWriter將文檔「打印」到打印機中。重要的是在Sync中執行打印而不是Async,因爲只有在將文檔發送到打印後,才能重新顯示隱藏的內容。無論如何,這段代碼是基於this workaround的WPF美化頁面。

無論如何,它隱藏了所有圖像(使它們透明),然後進行打印,並且僅在打印後才重新顯示它們。

DocumentViewer dv = sender as DocumentViewer; 
FixedDocument dokument = dv.Document as FixedDocument; 
if (dokument == null) return; 
PageContent content = dokument.Pages.First(); 
foreach (UIElement el in content.Child.Children) 
{ 
    Image image = el as Image; 
    if (image != null) 
     image.Opacity = 0; 
} 
PrintDialog dialog = new PrintDialog(); 
dialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 
dialog.PrintTicket = dialog.PrintQueue.DefaultPrintTicket; 
dialog.PrintTicket.PageOrientation = PageOrientation.Landscape; 

if (dialog.ShowDialog() == true) 
{ 
    XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(dialog.PrintQueue); 
    writer.Write(dokument, dialog.PrintTicket); 
} 
foreach (UIElement el in content.Child.Children) 
{ 
    Image image= el as Image; 
    if (image!= null) 
     image.Opacity = 0.75; 
} 

當然至少還有一個問題。對於用戶來說,在對話框打開的時候,背景會消失,而且我沒有看到我只是簡單地解決了這個問題,因爲Document Viewer沒有區分用戶看到的內容和發送到計算機的內容。

+0

或者,您可以將不透明屬性數據綁定到您的ViewModel中的一個屬性,以顯示您是否正在打印。這樣你可以避免隱藏所有你想隱藏的東西所需的意大利麪代碼。 – 2015-04-15 07:30:12