SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 4で作る新しいRIAアプリケーション

Silverlight 4で強化された実行環境

Silverlight 4で作る新しいRIAアプリケーション(5)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (1.2 MB)

印刷ダイアログの表示

 これまで、Silverlightでページを印刷しようとした場合、HTML-DOM連携を利用してJavascript経由でHTMLの印刷画面を表示するか、プログラム側で画像ファイルやPDFを生成して、画像ビューワーやPDFビューワーの印刷機能を利用するほかありませんでした。Silverlight 4では、ユーザーからの要望が多かったSilverlight単体での印刷機能が追加されています。

 ここでは、ドラッグアンドドロップで利用したページに、プリント機能を追加します。リスト5のコードに、リスト7のように操作用のボタンにそれぞれイベントハンドラを定義してください。

リスト7 印刷ボタンに対するイベントハンドラの設定(Printing.xaml)
<StackPanel x:Name="commandPanel" Orientation="Horizontal">
    <Button Content="ページ全体を印刷" Click="PrintAllElement" />
    <Button Content="リストボックスを印刷" Click="PrintListBox" />
</StackPanel>

 コード側を確認していきましょう。表示中の画面を印刷する例をリスト8に示します。

リスト8 指定された要素を印刷するためのサンプル(Printing.xaml.cs)
// 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標準の印刷設定ダイアログが表示されます。

図3 プリンターの選択ダイアログ
図3 プリンターの選択ダイアログ

 サンプルコードを見て気づいた方もいると思いますが、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のように四角形を右クリックしたタイミングでメニューを表示し、指定された色に四角形の背景色を変更するものです。

図4 コンテキストメニューの実行結果
図4 コンテキストメニューの実行結果

 まずは、リスト5の四角形に対するコンテキストメニューを定義します(リスト9)。

リスト9 コンテキストメニューの設定(Printing.xaml.cs)
<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つがあります。

  1. コンテキストメニューそのものを表すContextMenuコントロール
  2. コンテキストメニューの中に表示する各MenuItemコントロール
  3. 該当のコントロールが右クリックされたときにコンテキストメニューを表示したり、非表示にしたりするContextMenuService

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5682 2011/01/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング