所以我一直在构建一个打印在某些表单上的WPF应用程序。这些表格预先印有空白区域,您应该在其中写入一些信息。 WPF应用程序需要精确打印文本,以便WPF打印的文本与预打印形式的文本和空白完美对齐。通过使用DocumentViewer和FixedDocument,我能够在很大程度上完成任务。
由于某些原因,VS WPF设计师不喜欢将PageContent放入DocumentViewer中的FixedDocument,即使你可以将PageContent放在任何其他容器(如Scroll Viewer)中,它也会完美呈现。但即使VS XAML解析器不起作用,我也可以编译并运行我的应用程序。
另一方面的问题来自于我无法找到隐藏FixedDocument中的某些元素的方法。为了让用户更加精确地在应用程序中输入信息并知道我将放置该信息的打印形式,我将表格的扫描图像放在FixedDocument的背景中。但我只希望在用户在DocumentViewer中查看文档时显示它,我不希望在按下打印按钮时打印该图像。
现在在Windows窗体中,我可以处理OnPrint事件并使用IsPrintPreview属性,我可以决定要打印什么以及不打印什么。另一方面,DocumentViewer似乎不允许我决定要打印什么和不打印什么。
Soooo,长话短说,有没有办法隐藏FixedDocument中的某些控件在DocumentViewer中打印?
答案 0 :(得分:1)
我“解决了”这个问题。很好的解决了certan的定义。 为了将来的参考,我所做的是通过在Print命令上附加我自己的打印代码来覆盖DocumentViewer自己的打印代码:
<DocumentViewer.CommandBindings>
<CommandBinding Command="ApplicationCommands.Print" Executed="PrintExecute"/>
</DocumentViewer.CommandBindings>
而且在我的代码中,我会隐藏文档中我不想打印的内容,显示对话框,而不是使用XPSDocumentWriter将文档“打印”到打印队列中。这里重要的是在同步而不是异步中进行打印,因为您只能重新显示在将文档发送到打印后隐藏的内容。无论如何,这段代码基于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;
}
当然至少还有一个问题。对于用户,当对话框打开时背景将消失,我不认为我解决了这个问题,因为文档查看器没有区分用户看到的内容和发送到计算机的内容。