WPF Prism episode: 13 ~ カスタマイズしたらメッセージボックスだった件 ~

← 前回記事【WPF Prism episode: 12 ~ Prism メッセージボックスの Service な日常 ~】

前回は Prism に標準組み込みのメッセージボックスを表示する方法を紹介したので、今回は前回エントリに引き続き Prism の INotification と IConfirmation を応用して自作したメッセージボックスを表示する方法を紹介します。

尚、この記事は Visual Studio 2017 Community Edition で .NET Framework 4.7.2 以上 と C# + Prism 7.1 + ReactiveProperty + Extended WPF Toolkit™ を使用して 、WPF アプリケーションを MVVM パターンで作成するのが目的で、C# での基本的なコーディング知識を持っている人が対象です。

Prism のメッセージボックスをカスタマイズする

前回紹介した Prism 組み込みのメッセージボックスは、確認メッセージボックスの「OK」、「キャンセル」ボタンを「はい」と「いいえ」に変更したり、MessageBox クラスに表示されるようなお馴染みのアイコン等を追加するようなことはできませんが自作したメッセージボックスを表示することはできます

ただ、自作とは言っても開発者が指定できるのはメッセージボックスのコンテンツ(中身)部分を UserControl として作成できるだけで、外側の枠(ウィンドウ)部分は Prism が内部で生成するため基本的には手が出せません。

INotification で表示するメッセージボックス(OK ボタンのみのメッセージボックス)をカスタマイズする例は episode: 2 でも紹介した Prism 公式サンプル No.27 CustomContent にあるので、ここでは「OK」・「キャンセル」ボタンのある確認メッセージボックスをカスタマイズします。

とは言っても公式サンプルに少し手を加えるだけで、ほとんど公式サンプルと変わりません。
後述しますが、公式サンプルの Notification ベースのメッセージボックスはコードビハインドで作成されているので、MVVM パターンで作成する例を紹介しようと思って作ってみたんですが… メッセージボックスを MVVM パターンで作成するメリットはありませんでした。

メッセージボックスのプロパティやコマンドを VM にバインドするとしても、バインドが必要な項目自体多くありませんし煩雑になるだけで紹介する程の情報はありませんでした。
どうしても全て MVVM パターンで作らないと気が済まないという場合以外ではコードビハインドで作成することをお勧めするので、ここで紹介する自作メッセージボックスも公式サンプルと同じくコードビハインドで作成します

Prism 組み込みのメッセージボックスをカスタマイズするための XAML

まず最初にメッセージボックスのコンテンツ部をレイアウトするための UserControl をプロジェクトへ追加しますが、ここでは前回エントリでメッセージボックス表示用 Service を追加した WpfTestAppServices プロジェクトへ【Prism UserControl】を追加します。

今回は Service 用のプロジェクトが既に存在したため流用しましたが、本来このようなプロジェクトは自作のベースライブラリ用に独立したプロジェクトとして作成した方が良いと思います。
WpfTestAppServices プロジェクトは元々クラスライブラリプロジェクトとして作成したため、UserControl をプロジェクトに追加するためには Presentation.Core 等を別途参照に追加する必要があり、実際に新しいプロジェクトを作成する場合は Prism Module プロジェクトか、カスタムコントロールプロジェクトで作成する方が楽だと思います。

平凡な見た目ですが、下 fig. 1 のようなメッセージボックスを作成します。

fig.1 自作したメッセージボックス

UserControl をプロジェクトへ追加したら以下のようにXAML を編集します。ただ、以下のサンプルコード通りに作る必要はなく、確認メッセージボックスなので「はい」、「いいえ」の役割を持つ要素は必須ですが、それ以外は好きなように作成して構いません。

今までこの連載で紹介してきた UserControl との最大の違いは、名前空間のエイリアスを宣言した中に Prism のエイリアスが存在しない事と、【prism:ViewModelLocator.AutowireViewModel=”True”】も存在しない事です。
このメッセージボックスはコードビハインドだけで動作するため VM は使用しないので、AutowireViewModel=”True” が指定されている場合は削除してください

IInteractionRequestAware を経由してメッセージボックスを操作する

MVVM パターンでコマンドを指定する場合と違い、コードビハインドにイベントハンドラを追加するには、Windows Form と同じく XAML のデザインビューから対象コントロールをダブルクリックするか、下 fig.2 のようにプロパティウィンドウを使用します。

fig.2 イベントハンドラの追加

プロパティウィンドウからイベントハンドラを追加する方法も Windows Form と全く同じで、プロパティウィンドウ右上の稲妻アイコンをクリックしてイベント用の View に切り替え、追加したいイベント(ここでは Click)をダブルクリックすれば XAML とコードビハインドにイベントが自動的に追加されます。
(イベント名を入力して Enter でも追加されます)

そして確認メッセージボックスのコードビハインドを以下のように編集します。

まず今まで紹介してきた UserControl と違い、メッセージボックスに使用する場合は 10 行目のように IInteractionRequestAware インタフェースを継承する必要があり、Notification、FinishInteraction プロパティは IInteractionRequestAware インタフェースのメンバです。

公式サンプルとほんの少し違うのは、12 ~ 19 行目の Notification プロパティを自動実装プロパティではなく通常のプロパティにした部分で、これは Prism からセットされる INotification を IConfirmation にキャストするためです。
大した意味は無く、「はい」・「いいえ」ボタン Click のイベントハンドラ内で IConfirmation を使用したいからで、プロパティ設定時にキャストせず個々のベントハンドラ内でキャストしても構いません。

そして前述の通り、27 ~ 31 行目、36 ~ 40 行目のイベントハンドラ内で IConfirmation.Confirmed プロパティに戻り値をセットして、戻り値セット後に IInteractionRequestAware.FinishInteraction.Invoke メソッドを実行してメッセージボックスを閉じています

実際に作ってみると XAML へ定義した Title と Content はどこにバインドされるか不思議に思うかもしれませんが、VM から InteractionRequest.Raise メソッドでメッセージボックスを表示すると Prism はパラメータに渡した INotification をメッセージボックスの DataContext に設定します
そのため、INotification の Title、Content プロパティがバインドされると言う仕組みです。

PopupWindowAction.WindowContent に自作したメッセージボックスを指定する

自作したメッセージボックスを表示するには、前回エントリの episode: 12 で紹介した、MainWindow.xaml の記述を以下のように少し変更するだけで表示できます。

自作したメッセージボックスは、MainWindow と名前空間は同じですが別アセンブリなので、MainWindow から参照できるようにアセンブリ名を付与したエイリアスを宣言しています。(4 行目)

前回のエントリで紹介した内容とほとんど変わりませんが、PopupWindowAction.WindowContent に作成した UserControl 名(ConfirmPopup)を指定するだけです。

但し、16 行目に新規スタイル ResizeMode を追加してメッセージボックスウィンドウのリサイズを禁止しています。これを指定しないとリサイズ可能なメッセージボックスが表示されてしまうので指定した方が良いでしょう。

又、前回エントリで作成した MessageBoxService も変更せずそのまま使用できます。
必要があれば、メッセージボックスを呼び出すための IMessageBoxService.ShowConfirmMessage に渡す IConfirmation の Title、Content プロパティを変更してください。

後は前回のエントリで紹介した通りメッセージボックスを表示するオペレーションをすれば以下のように自作したメッセージボックスが表示されます。

fig.3 自作メッセージボックスの表示

このメッセージボックスのデザインはショボイですが、UserControl 上にデザインすることでメッセージボックスの外観を自分の好きなようにカスタマイズできるようになります。
尚、このサンプルのメッセージボックスに使用しているアイコンは episode: 5 でも紹介した Icons8 で配布されている画像を使用しています。

 

次は Prism で作成したダイアログウィンドウを MVVM パターンで表示する方法を紹介する予定でしたが、長くなったので次回へ持ち越しすることにします。

いつも通り今回作成したサンプルも GitHub リポジトリに上げています。

 

【WPF Prism episode: 14 ~ ListBox 相手は ReactiveCollection、ダイアログな、Prism。 ~】次回記事 →

 

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。