質問
WPFのメモリコレクションまたは可変サイズで印刷する方法はありますか?
次のコードを使用して、ListViewコントロールを印刷しています。ただし、コンテンツが垂直スクロールバーよりも大きい場合は、コンテンツを引き継いで切り取ります。
PrintDialog printDialog = new PrintDialog();
printDialog.ShowDialog();
printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
解決
DocumentPaginatorを実装するクラスを使用するだけで複数のページを印刷するには、FixedDocumentはより複雑な実装の1つであり、FlowDocumentはより単純な実装です。
FlowDocument fd = new FlowDocument();
foreach(object item in items)
{
fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
}
fd.Print();
または
PrintDialog pd = new PrintDialog();
pd.PrintDocument(fd);
他のヒント
FixedDocumentは、他のxamlドキュメントと同様にDataFlow(FlowDocument以外)をサポートします。固定ドキュメントでリストビューをホストし、DocumentViewer(ビルトイン印刷サポートがある)で表示するだけです。
ただし、リストが1ページに対して長すぎる場合、FixedDocumentは新しいページを自動的に生成しません(flowdocumentのように)。したがって、純粋なxamlでは実行できないため、コードを使用して手動で新しいページを作成する必要があります。
WPFからの素晴らしい印刷が必要な場合、FixedDocumentを作成して印刷する必要があります。残念ながら、印刷しようとしているものによっては非常に複雑になる場合があります。
FixedDocumentを作成するサンプルコードがここにあります: http://www.ericsink.com /wpf3d/B_Printing.html
これは2019年の回答です。古い回答のいくつかはもう機能しません。 FlowDocumentReaderには Print
メソッドがありません。
private void Button_Click(object sender, RoutedEventArgs e)
{
FlowDocument fd = new FlowDocument();
foreach (var item in COLLECTION) //<- put your collection here
{
fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
}
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() != true) return;
fd.PageHeight = pd.PrintableAreaHeight;
fd.PageWidth = pd.PrintableAreaWidth;
IDocumentPaginatorSource idocument = fd as IDocumentPaginatorSource;
pd.PrintDocument(idocument.DocumentPaginator, "Printing Flow Document...");
}
}
興味深いことに、ListViewは仮想化されていますか?そうである場合、オブジェクトは描画されません、それは可能性です。 Petzoldの印刷例をご覧ください。
この問題に対する私の解決策を以下に示します。それはちょっと不安定ですが、私のシナリオでは動作します。
コレクションを読み取り、文字列に変換します。コレクション全体がStringBuilderオブジェクトに含まれるようになりました。次に、クライアントのマシン上のファイルにテキスト/文字列が含まれていることを確認し、/ pを指定してメモ帳プロセスを実行し、ファイルの内容を印刷しました。
動作し、コンテンツを正常に印刷します。
最後に、5秒後に呼び出され、ファイルを削除するタイマーがあります。基本的には、5秒以内に要求は既にプリンターキューに送信されます。しかし、より良い解決策は、印刷ジョブがこのように処理されていることを確認することです。これにより、ジョブが実行されたことを100%確認できます。