我正在使用 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/