我正在使用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
答案 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;
}
}