1

所以我一直在构建一个在某些表单上打印的 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 中打印?

4

1 回答 1

1

我“解决”了这个问题。好吧,对于解决的某些定义。为了将来参考,我所做的是通过附加我自己的打印命令来覆盖 DocumentViewer 自己的打印代码:

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

与在我的代码中相比,我会在文档中隐藏我不想打印的内容,显示对话框,而不是使用 XPSDocumentWriter 将文档“打印”到打印队列中。这里重要的是在同步而不是异步中进行打印,因为您只能在将文档发送到打印后重新显示隐藏的内容。无论如何,此代码基于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;
}

当然,至少还有一个问题。对于用户来说,对话框打开时背景会消失,我看不到我解决了这个问题,因为文档查看器没有区分用户看到的内容和发送到计算机的内容。

于 2013-04-24T10:36:47.437 回答