【问题标题】:How to hide a DocumentViewer page element from printing如何从打印中隐藏 DocumentViewer 页面元素
【发布时间】:2013-04-22 12:59:35
【问题描述】:

所以我一直在构建一个在某些表单上打印的 WPF 应用程序。这些表格预先印有空白,您应该在其中填写一些信息。 WPF 应用程序需要精确打印文本,以便 WPF 打印的文本与预打印形式的文本和空白完美对齐。通过使用 DocumentViewer 和 FixedDocument,我能够在很大程度上成功地完成任务。

最大的问题是,由于某种原因,VS WPF 设计器不喜欢将 PageContent 放入 DocumentViewer 中的 FixedDocument 中,即使您可以将 PageContent 放入任何其他容器(如 Scroll Viewer)中并且它会完美呈现。但即使 VS XAML 解析器无法运行,我也可以毫无问题地编译和运行我的应用程序。

另一个问题是我无法找到一种方法来隐藏 FixedDocument 中的某些元素以防止打印。为了让用户更准确地将信息输入应用程序并知道我将在打印表单中放置该信息的位置,我将表单的扫描图像放在 FixedDocument 的背景中。但我只希望它在用户在 DocumentViewer 中查看文档时显示,我不希望在他按下打印按钮时打印该图像。

现在在 Windows 窗体中,我可以处理 OnPrint 事件,并使用 IsPrintPreview 属性来决定打印什么和不打印什么。另一方面,DocumentViewer 似乎不允许我决定打印什么和不打印什么。

太棒了,长话短说,有没有办法隐藏 FixedDocument 中的某些控件以防止在 DocumentViewer 中打印?

【问题讨论】:

    标签: wpf printing documentviewer fixeddocument


    【解决方案1】:

    我“解决”了这个问题。好吧,对于解决的某些定义。 为了将来参考,我所做的是通过附加我自己的打印命令来覆盖 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;
    }
    

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

    【讨论】:

    • 或者,您可以将 opacity 属性数据绑定到 ViewModel 中的一个属性,该属性显示您是否正在打印。这样你就避免了隐藏所有你想隐藏的东西所必需的意大利面条代码。
    猜你喜欢
    • 2010-09-26
    • 2016-04-26
    • 1970-01-01
    • 2011-01-22
    • 2010-11-16
    • 1970-01-01
    • 2012-08-26
    • 2021-12-09
    相关资源
    最近更新 更多