RichTextBox内の各オブジェクトを印刷する

2010年6月14日(月)
PROJECT KySS

印刷処理のロジック・コードを記述する

以上の作業を終えたら、ロジック・コードを記述していきましょう。印刷処理には、印刷の機能を提供するクラスの含まれる、System.Windows.Printing名前空間を使います(リスト4)。

リスト4: ロジック・コード(MainPage.xaml.vb)

■名前空間の読み込みと、プロパティの定義
LINQ to XMLでXMLを処理するクラスの含まれる、System.Xml.Linq名前空間をインポートします。
印刷の機能を提供するクラスの含まれる、System.Windows.Printing名前空間をインポートします。
Option Strict On
Imports System.Xml.Linq
Imports System.Windows.Printing

personalInfoクラス内に、「氏名、年齢、住所、勤務先」のプロパティを定義します。
VS 2008では、単にフィールドに値を保存したり取得するにも、Get/Setコードを記述する必要があり、コード自体が冗長になっていました。しかし、VS 2010では、VB 2010の自動実装プロパティを使用することができ、personalInfoクラスを以下のコードだけを使用して実装できるようになりました。
Public Class personalInfo
  Property 氏名() As String
  Property 年齢() As String
  Property 住所() As String
  Property 勤務先() As String
End Class

■ページが読み込まれたときの処理
XElement.LoadメソッドでXML文書ファイルを読み込みます。要素のコレクションを取得するクエリー(query)を定義します。
personalInfoクラスのリストとして作成するmyPersonalInfoを宣言して、queryを実行します。
クエリー・コレクション内を反復処理しながら、Addメソッドで、personalInfoクラスの各プロパティ(「氏名、年齢、住所、勤務先」)に、XMLの各要素(、、、)の値を追加します。
DataGridコントロール(名前はDataGrid1)のItemsSourceプロパティに、myPersonalInfoオブジェクトを指定します。これで、DataGrid内にXMLデータが表示されます。
  Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Win  dows.RoutedEventArgs) Handles Me.Loaded
    Dim xmldoc As XElement = XElement.Load("sampleData.xml")
    Dim query = From c In xmldoc.Descendants("情報") Select c
    Dim myPersonalInfo As New List(Of personalInfo)
    For Each result In query
      With myPersonalInfo
        .Add(New personalInfo With {.氏名 = result.Element("氏名").Value,
        .年齢 = result.Element("年齢").Value,
        .住所 = result.Element("住所").Value,
        .勤務先 = result.Element("勤務先").Value})
      End With
    Next
    DataGrid1.ItemsSource = myPersonalInfo
  End Sub

■[全部プリント]ボタンがクリックされたときの処理
新しいPrintDocumentのインスタンスmyPrintオブジェクトを生成します。PrintDocumentクラスはSilverlightアプリケーションの印刷機能を提供するクラスです。
AllPrintGoイベントを実行し、Printメソッドで印刷キューに指定するドキュメントの名前を指定して、印刷を開始します。myPrintオブジェクトにNothingを指定して、オブジェクトとの関連付けを解除します。
  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim myPrint As New PrintDocument
    AddHandler myPrint.PrintPage, AddressOf Me.AllPrintGo
    myPrint.Print(“AllPrint”)
    myPrint = Nothing
  End Sub

■RichTextArea内全てを印刷する処理
印刷する要素を指定するPageVisualプロパティにRichTextBox1を指定します。HasMorePagesプロパティにFalseを指定して、指定したページ以外に印刷対象のページがないことを明示します。
  Private Sub AllPrintGo(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    e.PageVisual = RichTexBox1
    e.HasMorePages = False
  End Sub

■[動画プリント]ボタンがクリックされたときの処理
MediaElementPrintGoイベントを実行し、Printメソッドで印刷キューに指定するドキュメントの名前を指定して、印刷を開始します。
  Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
    Dim myPrint As New PrintDocument
    AddHandler myPrint.PrintPage, AddressOf Me.MediaElementPrintGo
    myPrint.Print(“MediaElementPrint”)
    myPrint = Nothing
  End Sub

■MediaElementを印刷する処理
印刷する要素を指定するPageVisualプロパティに、MediaElement1を指定します。
  Private Sub MediaElementPrintGo(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    e.PageVisual = MediaElement1
    e.HasMorePages = False
  End Sub

■[表プリント]ボタンがクリックされたときの処理
DataGridPrintGoイベントを実行し、Printメソッドで印刷キューに指定するドキュメントの名前を指定して、印刷を開始します。
  Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
    Dim myPrint As New PrintDocument
    AddHandler myPrint.PrintPage, AddressOf Me.DataGridPrintGo
    myPrint.Print(“DataGridPrint”)
    myPrint = Nothing
  End Sub

■DataGridを印刷する処理
印刷する要素を指定するPageVisualプロパティに、DataGrid1を指定します。
  Private Sub DataGridPrintGo(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    e.PageVisual = DataGrid1
    e.HasMorePages = False
  End Sub

■MediaElementの下にレイアウトされている[Play]ボタンがクリックされたときの処理
Playメソッドで、ビデオの再生を開始します。
  Private Sub playButton_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles playButton.Click
    MediaElement1.Play()
    pauseButton.IsEnabled = True
    playButton.IsEnabled = False
  End Sub

■MediaElementの下にレイアウトされている[Pause]ボタンがクリックされたときの処理
Pauseメソッドで、ビデオを休止します。使用不可となっていた[PLAY]ボタンを使用可にします。
  Private Sub pauseButton_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles pauseButton.Click
    MediaElement1.Pause()
    playButton.IsEnabled = True
    pauseButton.IsEnabled = False
  End Sub

■ビデオの再生が完了したときの処理
MediaElement1コントロールのPositionプロパティに、時間間隔を0に戻すよう指定します。これで、ビデオが開始時の状態になります。Playメソッドでビデオを開始します。[PAUSE]ボタンをクリックしない限り、再生を繰り返します。
  Private Sub MediaElement1_MediaEnded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles MediaElement1.MediaEnded
    MediaElement1.Position = TimeSpan.FromSeconds(0)
    MediaElement1.Play()
    playButton.IsEnabled = False
    pauseButton.IsEnabled = True
  End Sub

次回は、DataGridコントロールを用いた、表印刷とフル・スクリーン・モードでの編集処理について取り上げます。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています