WPF 打印流程文档

标签 wpf printing flowdocument

问候,
我在 WPF 中打印时遇到问题。
我正在创建一个流文档并向该流文档添加一些控件。
打印预览工作正常,我从打印预览窗口打印没有问题。
当我在没有打印预览的情况下直接打印到打印机时存在问题。但更令人惊讶的是——当我使用 XPS Document Writer 作为打印机时
一切都很好,当我使用一些物理打印机时,我的流文档上的一些控件没有显示。
提前致谢

最佳答案

需要注意的重要事项:即使直接打印到物理打印机,您也可以使用 XpsDocumentWriter。不要因为您没有创建 .xps 文件而犯我避免它的错误!

无论如何-我也遇到了同样的问题,DoEvents() 都没有。黑客似乎工作。我也不是特别高兴必须首先使用它们。在我的情况下,一些数据绑定(bind)控件打印得很好,但其他一些(嵌套的 UserControls)没有。就好像只有一个“级别”被数据绑定(bind),其余的即使使用“DoEvents()”黑客也不会绑定(bind)。

解决方案很简单。像这样使用 XpsDocumentWriter。它将打开一个对话框,您可以在其中选择所需的任何已安装的物理打印机。

        // 8.5 x 11 paper
        Size sz = new Size(96 * 8.5, 96 * 11);

        // create your visual (this is a WPF UserControl)
        var template = new PackingSlipTemplate()
        {
            DataContext = new PackingSlipViewModel(order)
        };

        // arrange
        template.Measure(sz);
        template.Arrange(new Rect(sz));
        template.UpdateLayout();

        // print to XpsDocumentWriter
        // this will open a dialog and you can print to any installed printer
        // not just a 'virtual' .xps file
        PrintDocumentImageableArea area = null;
        XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(ref area,);

        xps.Write(template);

我在 ' Programming WPF 上找到了 OReilly 的书' 对 Printing - found through Google Books 的章节非常有用.

如果您不想出现打印对话框,但想直接打印到默认打印机,您可以执行以下操作。 (对我来说,该应用程序是在仓库环境中打印装箱单 - 我不希望每次都弹出对话框)。
        var template = new PackingSlipTemplate()
        {
            DataContext = new PackingSlipViewModel(orders.Single())
        };

        // arrange
        template.Measure(sz);
        template.Arrange(new Rect(sz));
        template.UpdateLayout();

        LocalPrintServer localPrintServer = new LocalPrintServer();
        var defaultPrintQueue = localPrintServer.DefaultPrintQueue;

        XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(defaultPrintQueue);
        xps.Write(template, defaultPrinter.DefaultPrintTicket);

关于WPF 打印流程文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672429/

相关文章:

swift - 尝试打印两个值时出错

c# - C# 中的 FlowDocument 内存问题

c# - 将 Flowdocument 转换为 XML 并将 XML 转换为 Flowdocument

c# - 如何将多个 FlowDocumentReader 添加到 StackPanel?

C# 绑定(bind)不起作用

wpf - 在没有 MVVM 的情况下开发 WPF 软件

java - 在 pdf-renderer (java) 上设置页边距

c# - 为什么在使用 Prism EventAggregator 时没有调用我的订阅方法?

c# - WPF 静态属性绑定(bind)不适用于 ListView

c++ - 在 qt 中打印阿拉伯文本的替代方法