WPF打印流程文档

时间:2009-11-04 08:43:14

标签: wpf printing flowdocument

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

3 个答案:

答案 0 :(得分:4)

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

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

解决方案很简单。像这样使用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);

答案 1 :(得分:1)

可以毫无问题地打印XPS文档

答案 2 :(得分:0)

我注意到一件事: 提示:未显示的控件是我绑定某些数据的控件,因此结论是绑定不起作用。可能是在将文档发送到打印机之前没有执行绑定吗?