印刷ダイアログの表示
これまで、Silverlightでページを印刷しようとした場合、HTML-DOM連携を利用してJavascript経由でHTMLの印刷画面を表示するか、プログラム側で画像ファイルやPDFを生成して、画像ビューワーやPDFビューワーの印刷機能を利用するほかありませんでした。Silverlight 4では、ユーザーからの要望が多かったSilverlight単体での印刷機能が追加されています。
ここでは、ドラッグアンドドロップで利用したページに、プリント機能を追加します。リスト5のコードに、リスト7のように操作用のボタンにそれぞれイベントハンドラを定義してください。
<StackPanel x:Name="commandPanel" Orientation="Horizontal">
<Button Content="ページ全体を印刷" Click="PrintAllElement" />
<Button Content="リストボックスを印刷" Click="PrintListBox" />
</StackPanel>
コード側を確認していきましょう。表示中の画面を印刷する例をリスト8に示します。
// 1.プリント用関数の定義
public void Print(string title, FrameworkElement element)
{
var printDocument = new PrintDocument();
printDocument.PrintPage += (_s, _e) =>
{
_e.PageVisual = element;
};
printDocument.Print(title);
}
// 2.ページ全体の印刷
public void PrintAllElement(object sender, RoutedEventArgs e)
{
Print("ページ全体の印刷", this);
}
// 2.画像のみの印刷
public void PrintImage(object sender, RoutedEventArgs e)
{
Print("イメージの印刷", image);
}
Silverlightで印刷ダイアログを表示するには、PrintDocumentクラスを利用します。
1では、PrintDocumentクラスを使用して、渡されたUI要素をPrintPageイベント時にイベント引数のPageVisualプロパティに設定することで、印刷するドキュメントを切り替えて印刷しています。
2では、押されたボタンによって、PrintDocumentクラスに渡すUI要素を切り替えて、画面全体を印刷したり、指定した要素のみを印刷したりしています。
このサンプルを実行すると、図3のようにOS標準の印刷設定ダイアログが表示されます。

サンプルコードを見て気づいた方もいると思いますが、PrintDocumentクラスには、プリンターの情報を設定できるようなプロパティなどは存在しません。PrintDocumentクラスで提供するのは、プリンターダイアログを開き、渡された要素のキャプチャー情報を渡すだけです。指定したプリンターで印刷したり、用紙サイズや用紙の向き、拡縮などを指定することはできません。
また、本連載の2回目でカメラデバイスの取り扱い時にも触れましたが、Silverlightでは、ユーザーのデバイスにプログラムでアクセスする場合、ユーザーのアクション以外(ページのロード時など)にプログラム側でデバイスにアクセスしようとすると、ArgumentExceptionが発生するので注意が必要です。
用紙に対して印刷する要素のサイズが大きすぎる場合や、複数ページにわたって印刷を行う場合には、BeginPrintイベント時に印刷する要素の情報を設定したり初期化する必要があります。詳しくは次のページを参照してください。
右クリックの補足とコンテキストメニューの表示
今までのSilverlightは、右クリックでSilverlightのプロパティ情報が表示されるだけで、右クリックのイベントを取得できませんでした。Silverlight 4では、マウスの右クリックイベントを捕捉できるようになりました。
右クリックのイベントの捕捉は、MouseRightButtonDownイベントとMouseRightButtonUpで行うことが可能です。例えば四角形がクリックされたタイミングで、四角形の色を赤く変更する場合は、単にMouseRightButtonUpイベントに四角形の背景色を変更する処理を記述するだけです。
ただし、右クリック時にコンテキストメニューを表示しようとすると、少し複雑になります。Silverlight 4ではコンテキストメニューは標準で提供されていないので、MouseRightButtonUpのタイミングに自前でコンテキストメニューを表示するか、Silverlight Toolkitに含まれるContextMenuコントロールを使うことになります。
Silverlight Toolkitを利用する場合、次のURLからダウンロードする必要があります。Expresson Blendをお使いの場合は、次のパスに既に存在しているはずですので、そちらを使っても構いません。
- Silverlight Toolkit
- Expression Blendインストール時にインストールされるSilverlight Toolkitのパス
%ProgramFiles(x86)%\Microsoft SDKs\Silverlight\v4.0\Toolkit\Apr10\Bin
このサンプルは、図4のように四角形を右クリックしたタイミングでメニューを表示し、指定された色に四角形の背景色を変更するものです。

まずは、リスト5の四角形に対するコンテキストメニューを定義します(リスト9)。
<navigation:Page x:Class="Silverlight4_5.Views.Printing"
... 略 ...
xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" />
... 略 ...
<Rectangle x:Name="dropTarget" Width="100" Height="100" Fill="Green" AllowDrop="True" Drop="Rectangle_Drop" >
<input:ContextMenuService.ContextMenu> <!-- 3 -->
<input:ContextMenu> <!-- 1 -->
<!-- 2 -->
<input:MenuItem Header="赤色" Tag="Red" Click="MenuItem_Click" />
<input:MenuItem Header="青色" Tag="Blue" Click="MenuItem_Click" />
<input:MenuItem Header="緑色" Tag="Green" Click="MenuItem_Click" />
</input:ContextMenu>
</input:ContextMenuService.ContextMenu>
</Rectangle>
... 略 ...
</navigation:Page>
コンテキストメニューを構成する要素には、次の3つがあります。
- コンテキストメニューそのものを表すContextMenuコントロール
- コンテキストメニューの中に表示する各MenuItemコントロール
- 該当のコントロールが右クリックされたときにコンテキストメニューを表示したり、非表示にしたりするContextMenuService
