Silverlight 4の印刷機能:RichTextBox編[3ページ目]

■RichTdextBox内のデータを複数ページに渡って印刷する処理

新しいStackPanelのインスタンスmyStackPanelオブジェクトを生成します。Orientationプロパティでスタックされるコンテンツを垂直方向に設定します。

新しいRichTextBoxのインスタンスmyRichTextBoxオブジェクトを生成し、BorderThicknessプロパティに0を指定して枠線を消します。

新しいParagraphのインスタンスmyParagraphオブジェクトを生成します。加算されるメンバ変数pageNumberが0のとき、つまり1回目にPrintPageGoプロシージャが呼ばれた時は、以下の処理を実行します。

<タイトル>要素と<著者>要素の内容を取得します。

テキストのビジュアル・プロパティを設定します。

新しいRunのインスタンスmyRunオブジェクトを生成します。Runクラスは書式付き、または書式なしのテキストのセクションを表すクラスです。フォントサイズ、太字と文字色を指定し、Textプロパティに取得しておいた「タイトル」を指定します。

以上の生成と設定ができたところで、myParagraphオブジェクトにmyRunオブジェクトを追加します。

表示されたタイトルの下に改行を追加するには、改行を表すLinebreakクラスを使います。新しいLinebreakのインスタンスmyLinebreakオブジェクトを生成して、myParagraphオブジェクトに改行を追加します。

新しいRunのインスタンスmyRun2オブジェクトを生成します。フォントサイズ、太字と文字色を指定し、Textプロパティに取得しておいた「著者」を指定します。

以上の生成と設定ができたところで、myParagraphオブジェクトにmyRun2オブジェクトを追加します。

表示された著者名の下に改行を追加して、内容を表示させるのに、新しいLinebreakのインスタンスmyLinebreak2オブジェクトを生成して、myParagraphオブジェクトに改行を追加します。

myRun、myRun2の定義されたmyParagraphオブジェクトをmyRichTextBoxオブジェクトに追加します。最後にmyStackPanelオブジェクトに、myRichTextBoxオブジェクトを追加します。この処理で、1ページ目の先頭に書式の設定された、「タイトル」と「著者名」が表示されます。

加算されるメンバ変数pageNumber2が、String型のリストとして作成するメンバ変数myContent に格納された、<内容>要素の個数より小さい間、Whileステートメントで以下の処理を繰り返します。myContentオブジェクトには、<内容>要素の内容が1行ずつ読みとられて格納されています。

新しい、TextBlockのインスタンスmyTextBlockオブジェクトを生成し、Marginプロパティに5を指定して、余白が5ピクセルになるようにします。また、TextWrappingプロパティを指定して、回り込みを可能としておきます。この記述を忘れると、長い文章は途中が切れてしまいますので注意してください。myTextBlockオブジェクトのTextプロパティに、String型のリストとして作成したメンバ変数myContentを指定します。添え字に加算されるpageNumber2変数を指定します。myStackPanelオブジェクトに、内容の追加された、myTextBlockオブジェクトを追加します。

myStackPanelに対して、SizeにWidthとHeightを指定して、Measureメソッドを呼び出します。Widthには印刷可能なWidth(e.PrintableArea.Width)を指定し、Heightには正の無限大を表すDouble.PositiveInfinityを指定します。

Measureメソッドは、レイアウト処理の測定パスの実行中に、UIElementが計算したサイズを更新します。

myStackPanelのDesiredSize.Heightが、印刷可能なHeight(e.PrintableArea.Height)より大きく、かつ、myStackPanelコントロールに追加されたmyTextBlockオブジェクトの個数が1より大きかった場合は、myStackPanelコントロールから、RemoveメソッドでmyTextBlockオブジェクトを削除し、HasMorePagesプロパティにTrueを指定して、まだ印刷するページがあることを明示します。次にWhileステートメントから抜けます。

HasMorePagesプロパティにTrueを指定すると、印刷するページがある限り、PrintPageGoプロシージャが呼び出されます。PrintPageGoプロシージャが呼び出され、新しいmyStackPanelが生成されmyTextBlockオブジェクトが追加される前に、すでにmyTextBlockオブジェクトが追加されている場合は、一度RemoveメソッドでmyTextBlockオブジェクトを削除します。この処理をしなければ、ごみが入る場合があります(図5)。String型のリストとして作成したmyContentオブジェクトの添え字に指定した、pageNumber2変数を加算します。印刷する要素を指定するPageVisualプロパティにStackPanelのオブジェクトであるmyStackPanelを指定します。これで、RichTextBoxコントロール表示されていたデータの一覧が、書式付で複数ページに、印刷、または書き出されます。メンバ変数pageNumberを加算します。

■印刷が完了したときの処理

「完了」というメッセージを表示します。

この「完了」というメッセージが表示されない限り、XPSファイルは書き出されませんので、注意してください。

図5: XPSファイルに書き出した際、先頭にごみが入っている(クリックで拡大)

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30