更改PrinterSettings.Copies不起作用

时间:2017-09-13 07:28:22

标签: 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;
    ...
}

我在PrinterSettings.Copies

之前设置document.Print()时有效
document.PrinterSettings.Copies = 3;

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

但是e.HasMorePages可以是真的,每个页面可以有不同的副本数,所以我必须在Document_PrintPage

中设置它

1 个答案:

答案 0 :(得分:2)

这种行为非常符合设计。 MSDN文档可能会更明确一些,并且一个例外不会受到影响,但这种限制很大程度上是Windows中打印体系结构的副作用。打印机驱动程序需要预先了解此详细信息。您的PrinterSettings用于打印作业的 start ,并且在打印过程中无法更改。你可以做什么打印时是有限的,但是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;
        }
    }