8

我正在尝试将打印支持添加到我正在编写的 C# WPF 应用程序中,我为此而烦恼。我正在尝试从 WPF 应用程序中的窗口打印单个图像。图像是运输标签,打印机是装有 4"x6" 运输标签纸的热敏打印机。打印代码如下:

PrintDialog pd = new PrintDialog();

if (pd.ShowDialog() == true)
{
    Image tmpImage = new Image();
    tmpImage.Stretch = Stretch.Uniform;
    tmpImage.Width = pd.PrintableAreaWidth;
    tmpImage.Source = this.img_label.Source;
    tmpImage.Measure(new Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight));
    tmpImage.Arrange(new Rect(new Point(0, 0), tmpImage.DesiredSize));

    pd.PrintVisual(tmpImage, "Shipping Label");
}

此代码的工作原理是它将显示打印对话框,我可以选择我的打印机,将其配置为使用正确的标签纸,然后打印标签。但是,正如其他帖子所指出的那样,它不会保存我选择的设置。因此,如果我选择再次打印相同的图像而不关闭应用程序,它会恢复为默认打印机,即使我选择了正确的打印机,也会将该打印机默认为默认设置,其中包括使用错误尺寸的标签纸. 因此,每次打印时,我都必须选择打印机并将其配置为使用正确的库存。这在现实世界的使用中是完全不能接受的。

在网上搜索了很多之后,我发现了很多关于这个的帖子,但他们都在谈论保存PrintDialog.PrinterSettings对象,然后用它来初始化下一个PrintDialog实例。但是,在 WPF 中,没有该类PrinterSettings的成员PrintDialog。那是一个 Win Forms 对象。为什么 Win Forms 和 WPF PrintDialog 对象不同,我无法理解,但这可能是一个无法回答的问题。真正的问题是我现在做什么。如有必要,我可以重新发明整个轮子并拥有自己的打印机选择器和打印机配置页,并使用PrintDocument对象打印图像并完全绕过PrintDialog。除非完全有必要,否则我宁愿不这样做。显示PrintDialog很好,这是人们习惯的,并且它已经具备配置内置打印机的所有能力。但是我如何初始化PrintDialogWPF 中的打印机以选择合适的打印机并使用正确的打印机设置?如果我只使用 Windows 窗体,这将是内置的。WPF 等价物是什么?

第二个问题是,如果没有等效的 WPF,推荐的处理方法是什么?我真的不需要让用户能够在我的应用程序中配置打印机。我想要它做的就是记住他们在下次打印时选择的先前设置,就像曾经编写的每个其他 PC 应用程序一样。这怎么会这么难?

任何人都可以提供的任何帮助将不胜感激。与此同时,我正在重新发明众所周知的轮子。我希望很快能得到一个更简单的答案。

谢谢!

4

1 回答 1

10

WPF 具有PrintTicketPrintQueue类(并且PrintDialog具有相应的属性,可以使用您保存的设置进行初始化)。

为简单起见,您可以将第一个视为纸张设置,将第二个视为打印机设置(选定的打印机)。

于 2013-07-28T20:21:40.700 回答