2018年 10月 16日
自動改ページ帳票クラスを作ってみました
原理的には、こちらの方とほぼ同じ方法ですが、(自分が)使い勝手の良い感じに仕上げています。
PrintPaginatorクラスの概要
機能
レポート形式と単票形式での印刷が可能です。
レポート形式とは、1ページに複数のコレクションを表示するモードです。上の画像のような感じです。
単票形式とは、1ページに1アイテムを表示するモードです。すなわち、コレクション数がそのままページ数になります。
レポート形式の既定の動作は、ページ生成時に1ページに表示できるコレクション数を求めてそれを動的に割り当てます。アイテムの内容によっては高さが変わることもあるので、はみ出した分は次のページから表示されます。
ただ、この動作は逐一レイアウト更新を行って高さを計算しているので、ページが増えるとクッソ重いです。
それの回避策として、1ページに表示する最大コレクション数を固定するようにもできます。固定するには、下のプロパティ一覧にある FixedCollectionCount に1以上の値をセットします。
※2018.10.13 追記
レイアウト更新を必要最小限の回数に抑えたので、ほんのちょっとだけ軽くなりました。
ただ、一度すべてのコレクションを読ませるという処理をやっているので、これがとにかく重いです。1万件とか読ませたらもうヤバイです。死にます。
そういう場合は、コレクション数を決め打ちしたほうがいいです。
そこまで件数が多いと、どちらにしろページ生成するのに時間を食いますけど。
※2018.10.16 追記
DataGridのようにScrollViewerを持っているコントロールの場合は、ViewportHeightから表示行数を読み取るように変更しました。
大量データでもこれで速くなる! と、思ったんですが、まったくもって速くなりませんでした。
というのも、ページの生成自体はすぐに終わるんですが、プレビュー画面に表示されるまでが重たいです。
レンダリング能力の問題なので、もはや、自分の力ではどうにもできません。
帳票テンプレートはXAMLでFixedPageを定義してください。
PrintPaginatorオブジェクトはXAMLを外部ファイル、又は、リソースから読み込みます。
リソースから読み込ませたい場合は、帳票XAMLのビルドアクションを「埋め込みリソース」にしてください。
サンプルアプリケーションには、両方の帳票サンプルが含まれていますので参考にしてください。
そして、高さ計算用にページ全体を包含しているUI要素(Gridとか)には「PageConstrol」、コレクションのUI要素(ItemsControlとか)には「CollectionControl」という名前を付けてください。(Nameプロパティです)
ただ、単票、又は、コレクション数を固定にした場合にはこれらの設定は不要です。(高さ計算しないので)
ページに表示できる印刷要素
- ヘッダー
- フッター
- コレクションアイテム
- 印刷日時
- ページ番号
- 総ページ数
もっと増やしたい場合は、ソースコードに好きに書き加えてください。
プロパティ
- Header ヘッダー要素
- Footer フッター要素
- Items コレクション要素
- ReportXamlPath XAMLのパスかリソース名
- IsSingleMode 単票モードに切り替え
- FixedCollectionCount 固定コレクション数(レポート形式で1以上の値を指定することで有効)
- PageOrientation 印刷向き(既定は縦)
- PageMediaSize 用紙サイズ(既定はA4)
- OutputColor カラーモード(既定はモノクロ)
- CopyCount 印刷部数(既定は1)
メソッド
- コンストラクタ XAMLファイル、ヘッダー、フッター、コレクションが指定できます
- Preview 印刷プレビューウィンドウを表示します
- Print ただちに印刷します
- GenerateReport FixedDocumentを生成して返します
ご注意
所詮、FixedPageなので用紙サイズを変えてもほとんど意味ありません。
A3で印刷したいなら、結局、A3用のXAMLを作る必要があります。
FlowDocumentとかDocumentPaginatorとかをうまく使えばこんなことしなくていいのかもしれませんが、使い方がさっぱり分かりません。誰か教えてください。
WPFで印刷したいときみんなどうしてるの?
実際の使い方
1 | // レポート形式の表示 |
サンプル帳票
1 | <FixedPage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
PrintPaginator.cs
1 | using System; |
by mikaka-flyff
| 2018-10-16 19:39