2017-09-13 92 views
2

我使用WPF框架4.0更改PrinterSettings.Copies不工作

我期望是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可能是真的,每页可以有不同的副本数,所以我必须将其设置在Document_PrintPage

回答

2

此行为是非常设计。 MSDN文档可能会更明确一些,并且异常不会受到影响,但是这种限制非常影响Windows中打印体系结构的副作用。打印机驱动程序需要事先了解这些细节。您的打印设置用于打印作业的开始,并且在打印过程中不能更改。你可以做什么打印是有限的,但通过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; 
     } 
    } 
+0

很好的答案,但不能解决问题。我仍然需要对多个副本再次进行相同的计算。如果一个页面的拷贝数是10,我做了10次计算,这是我想要避免的。 – tetralobita

+1

您正在谈论无人可以看到的代码。当然,你无法得到体面的建议。如果您需要将计算结果存储在集合或类中,以便在打印时可以使用它们10次,那就这样做。 –