您好,我在 WPF 中打印时遇到问题。我正在创建一个流文档并向该流文档添加一些控件。打印预览工作正常,我从打印预览窗口打印没有问题。当我在没有打印预览的情况下直接打印到打印机时存在问题。但更令人惊讶的是 - 当我使用 XPS Document Writer 作为打印机时,一切正常,当我使用一些物理打印机时,我的流文档上的一些控件不显示。提前致谢
user189627
问问题
6409 次
3 回答
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);
我发现 OReilly 的“ Programming WPF ”一书非常有用,其中关于打印的一章是通过 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);
于 2010-08-27T10:43:45.627 回答
1
XPS 文档可以毫无问题地打印
于 2009-11-04T08:48:09.043 回答
0
我注意到一件事: 提示:未显示的控件是我正在绑定一些数据的控件,因此结论是绑定不起作用。是否在将文档发送到打印机之前没有执行绑定?
于 2009-11-04T14:45:31.067 回答