2011-07-06 4 views
1

WPFのデータにバインドされたコントロールを印刷する必要があります。グリッドのようなコントロールがユーザーコントロールにあり、ユーザーコントロールを印刷したいと考えています。また、ページネーション、ヘッダーとフッター、カスタムロゴの挿入もサポートする必要があります。WPFのデータにバインドされた印刷コントロールのガイダンス

私は始めるのに役立つ記事/サンプルコードはありますか?

答えて

3

ビジュアルをプリンタに送信するのは非常に簡単ですが、ページング、スケーリング、ヘッダー、およびフッターを処理する必要がある場合は、少し複雑になります。しかし、これだけでも難しいことではありません。ユーザーxamlのユーザーコントロールを作成することで、印刷出力を生成できます。このワークフローの一般的なイメージは、printing overview on MSDNが好きです。

ページネーションを行うには、System.Windows.Documents.DocumentPaginatorを継承するクラスを作成することをお勧めします。このクラスを使用すると、印刷するページと各ページの項目の配置方法をプリンタに伝えることができます。

ページ設定の内部では、印刷するユーザーコントロールをインスタンス化することによってページをプログラムで作成します。ヘッダー/フッターが必要な場合は、これらのユーザーコントロールを作成し、インスタンス化し、必要なDataContextプロパティを設定してページに追加します。ほとんどの場合、プログラマチックにグリッドのようなものを作成し、列/行を構成し、ユーザーコントロールを追加してからそれをビジュアルとして返すことができます。

1つのトリック...レイアウトシステムにコントロールをレイアウトする必要がある場合があります。あなたが画面上に表示したときにこれが自動的に行われますが、手動で物事を作成している場合は、これを実行する必要があります自分自身:

 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のアイテムのようなものがあります。次に、各ページのリスト/グリッドに1つのセットをバインドします。

最後に、これをプリンタに取得する必要があります。ここでは、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

関連する問題