Silverlight4は簡易的な帳票出力に対応していて、UIElementを丸ごとプリンタに送り出せることは知っていたのですが、複数ページの出力はどうやるのか、いまいちイメージが沸かなかったので試してみることに。
PrintPageイベントがページ単位に発動されるのが混乱を招く感じですが、基本的にはページ毎にUIElementを設定してあげれば良い模様。
多少汎用的に書くとしたら、以下のような感じに書けば良いかと。
private List<UIElement> pageElement; private void button1_Click(object sender, RoutedEventArgs e) { //ページコンテンツ設定 pageElement = new List<UIElement>() { txtPage1, txtPage2 }; //印刷指示 var pd = new PrintDocument(); pd.Print("PrintTest"); //印刷処理 pd.PrintPage += (s, args) => { //カレントページにコンテンツを設定 args.PageVisual = pageElement[0]; //カレントコンテンツを削除 pageElement.RemoveAt(0); //次ページ有無チェック args.HasMorePages = (pageElement.Count > 0); }; }
このコードでは、テキストボックス txtPage1、txtPage2 をそれぞれ別ページに出力していますが、任意のUIElementを設定してあげれば、それがページのコンテンツになるという仕組みです。
ページコンテンツの中身は如何様にもカスタマイズできてしまうわけだし、プレビューの仕組みもそれほど難しくないと思われるので、このレポーティング機能、案外業務アプリでも使えるかもしれません。
コメントを残す