此行为是非常设计。 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;
}
}
很好的答案,但不能解决问题。我仍然需要对多个副本再次进行相同的计算。如果一个页面的拷贝数是10,我做了10次计算,这是我想要避免的。 – tetralobita
您正在谈论无人可以看到的代码。当然,你无法得到体面的建议。如果您需要将计算结果存储在集合或类中,以便在打印时可以使用它们10次,那就这样做。 –