2011-07-06 42 views
1

我有一個打印控件綁定到WPF中的數據的要求,我將有一個用戶控件,其中將有像網格綁定到數據的控件,我想打印用戶控件。我還需要支持分頁,頁眉和頁腳以及插入自定義徽標。打印控件綁定到WPF數據的指導

是否有任何文章/示例代碼可以幫助我入門。

回答

3

雖然向打印機發送視覺效果非常簡單,但如果需要處理分頁,縮放,頁眉和頁腳,它可能會更加複雜。但即使這並不是那麼困難,並且您可以通過編寫用戶xaml用戶控件來生成打印輸出。我喜歡這個printing overview on MSDN爲工作流程的一般圖片。

要執行分頁,您需要創建一個繼承自System.Windows.Documents.DocumentPaginator的類。通過該課程,您可以告訴打印機要打印哪些頁面以及每個頁面上的項目排列方式。

在paginator中,您將通過實例化要打印的用戶控件來編程式地構建您的頁面。如果你想要一個頁眉/頁腳,然後爲這些創建用戶控件,實例化它們,設置任何需要的DataContext屬性,並將它們添加到頁面中。在大多數情況下,您可以通過編程方式創建類似Grid的東西,配置列/行,爲其添加用戶控件,然後將其作爲可視化對象返回。

一招:你可能需要強制佈局系統來佈置控件。當你告訴它在屏幕上這是自動完成的,但如果你手動創建的東西,你需要做自己:

 var pageSize = new Size(8.5 * 96.0, 11.0 * 96.0); 
     var pageRect = new Rect(new Point(0, 0), pageSize); 
     ... 
     // create root visual (like a grid) and add user controls 
     ... 
     root.Measure(pageSize); 
     root.Arrange(pageRect); 
     root.InvalidateVisual(); 
     root.UpdateLayout(); 

在DocumentPaginator文檔解釋瞭如何使用類相當不錯。但對於分頁數據的情況,你可能需要自己做。我通常會確定頁面的大小以及我可以在該頁面上放置多少行。然後我編程地將數據分成多個集合。也許在每個集合中有25個項目。然後我將一個集合綁定到每個頁面的列表/網格。

最後,您需要將其發送給打印機。以下是我用來創建XPS文檔並將其發送到打印機的大致內容。並且...您可以使用這種變體輕鬆顯示打印預覽對話框。只需創建一個託管顯示XPS文檔的FixedDocumentViewer的對話框。

public static string Print(DocumentPaginator paginator, string printQueueName, string documentName) 
{ 
    using (MemoryStream xpsStream = new MemoryStream()) 
    { 
     using (Package package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      string packageUriString = "memorystream://data.xps"; 
      Uri packageUri = new Uri(packageUriString); 

      try 
      { 
       PackageStore.AddPackage(packageUri, package); 

       using (XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.Maximum, packageUriString)) 
       { 
        PrintTicket printTicket = new PrintTicket(); 
        printTicket.PageMediaSize = new PageMediaSize(paginator.PageSize.Width, paginator.PageSize.Height); 

        var writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument); 
        writer.Write(paginator, printTicket); 

        FixedDocumentSequence document = xpsDocument.GetFixedDocumentSequence(); 

        xpsDocument.Close(); 

        PrintQueue targetQueue = null; 

        // Get the queue. 
        if (!string.IsNullOrEmpty(printQueueName)) 
        { 
         var printServer = new LocalPrintServer(); 
         targetQueue = printServer.GetPrintQueue(printQueueName); 
        } 

        // If no queue, then ask the user for a queue. 
        if (null == targetQueue) 
        { 
         var printDialog = new PrintDialog(); 
         printDialog.PrintTicket = printTicket; 
         printDialog.UserPageRangeEnabled = false; 
         var response = printDialog.ShowDialog(); 

         if (response.GetValueOrDefault() && null != printDialog.PrintQueue) 
         { 
          targetQueue = printDialog.PrintQueue; 
         } 
         else 
         { 
          return null; 
         } 
        } 

        var targetQueueWriter = PrintQueue.CreateXpsDocumentWriter(targetQueue); 

        document.Name = documentName; 
        targetQueueWriter.Write(document); 
        return document.Name; 
       } 
      } 
      finally 
      { 
       PackageStore.RemovePackage(packageUri); 
      } 
     } 
    } 
} 
+0

什麼是根root.Measure()等?在他的」? – Boern