2017-09-13 94 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次,那就這樣做。 –