c# - 更改 PrinterSettings.Copies 不起作用

标签 c# wpf .net-4.0

我正在使用 WPF .Net Framework 4.0

我期望的是 3 页,但我只得到 1 页

var doc = new System.Drawing.Printing.PrintDocument();
document.PrintPage += Document_PrintPage;
document.Print();

private void Document_PrintPage(object sender, PrintPageEventArgs e) {
    e.PageSettings.PrinterSettings.Copies = 3;
    e.PageSettings.PrinterSettings.DefaultPageSettings.PrinterSettings.Copies = 3;
    ...
}

当我在 document.Print() 之前设置 PrinterSettings.Copies 时它起作用

document.PrinterSettings.Copies = 3;

但是这样它会打印所有页面 3 次

但是 e.HasMorePages 可以是 true 并且每个页面可以有不同的副本计数,所以我必须在 Document_PrintPage 中设置它

最佳答案

这种行为很大程度上是设计使然。 MSDN 文档对此可能更明确一些,异常(exception)也无妨,但此限制在很大程度上是 Windows 中打印体系结构的副作用。打印机驱动程序需要预先知道这个细节。您的 PrinterSettings 在打印作业开始时使用,并且在打印过程中无法更改。打印时 可以执行的操作是有限的,但 QueryPageSettings 事件很好地体现了这一点。仅允许更改 PageSettings。

在 WPF 应用程序中,您更有可能使用 System.Printing 命名空间,副本数由 PrintTicket.CopyCount 设置。完全相同的限制,您不能在打印时更改票。

您唯一可以做的另一件事是重复呈现页面以获得所需的副本数。我不得不说,问题中的代码片段不够详细,无法确定您如何设置 HasMorePages 属性。我们需要一些变量:

    public bool IsPrintPreview { get; set; }   // True to avoid copies while previewing
    public int NumberOfPages { get; set; }     // Determines HasMorePages

    private int PageNumber;                    // Page number while printing
    private int PageCopyCount;                 // Copy counter

我将编写一个方法来确定应为每个单独的页面呈现多少份副本:

    private int GetNumberOfCopies(int page) {
        if (page > NumberOfPages) return 0;
        if (IsPrintPreview) return 1;
        // TODO: modify this
        return 3;
    }

我们需要 BeginPrint 事件来初始化计数器:

    private void Document_BeginPrint(object sender, PrintEventArgs e) {
        PageNumber = 1;
        PageCopyCount = GetNumberOfCopies(PageNumber);
        if (PageCopyCount == 0) e.Cancel = true;
    }

以及 PrintPage 事件中计算份数和页数的逻辑:

    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) {
        // Draw output for page# PageNumber
        //...
        // Count copies and pages
        e.HasMorePages = true;
        if (--PageCopyCount == 0) {
            PageNumber += 1;
            PageCopyCount = GetNumberOfCopies(PageNumber);
            if (PageCopyCount == 0) e.HasMorePages = false;
        }
    }

关于c# - 更改 PrinterSettings.Copies 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46191408/

相关文章:

c# - 相对 SourceURI 不起作用

c# - 将来自控制台的用户输入解析为 C# 中的命令行参数

c# - 为什么我的 StackPanel 不在生成的类中? (空引用异常)

c# - StreamWriter 在 WriteLine 中间停止

wpf - 从字节数组创建 BitmapImage

wpf - 将 ItemsControl 与 ItemsSource 绑定(bind)到数组索引

c# - VB.Net 内联注释

c# - 解析用户的查询

c# - Catel在WPF导航应用程序中能否很好地工作

c# - 在 WPF 中使用枚举作为依赖属性