2013-04-22 48 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