WPF用のメッセージボックスです。
特徴
- 追加メッセージをエクスパンダーに配置して表示
- ヘルプボタンを表示
- メッセージの色を変更
- 影のエフェクトを表示可
- コンテキストメニューから、メッセージと追加メッセージをコピー可
- オーナーのウインドウを指定して薄暗くする。
- DIコンテナをサポート
- Modelからオーナーのウインドウを指定して表示
スクリーンショット
メッセージをカラー化
指定したパラメータで外観を変更
デモ
使い方
staticなMessageExを直接呼び出し
MessageEx.ShowInformationDialog("Message");
MessageEx.ShowInformationDialog("Message", "AppendedMessage");
MessageEx.ShowInformationDialog("Message", "AppendedMessage", "HelpURL");
DIコンテナにセットしたDialogService経由で表示
private readonly IDialogService _dialogService = Ioc.Default.GetRequiredService<IDialogService>();
_dialogService.ShowInformation("Message");
_dialogService.ShowInformation("Message", "AppendedMessage");
_dialogService.ShowInformation("Message", "AppendedMessage", "HelpURL");
詳しくは、コードを参照して下さい。
ダウンロード
アイコン
アイコンは、Fluent UI System Iconsを利用しました。
日本語化
public string OKCaption { get; set; } = "OK";
public string YesCaption { get; set; } = "Yes";
public string NoCaption { get; set; } = "No";
public string CancelCaption { get; set; } = "Cancel";
の部分で、OK以外を、「はい」「いいえ」「キャンセル」にして下さい。
ModelからViewのWindowをオーナーにして表示する
MVVMのModelかViewModelで、オーナーのウインドウを指定してダイアログを表示するために利用できる。
例:View(Window)でModelをnewする時の場合
- DialogServiceのプロパティWindowGuidを、WindowのTagにセット。
- CaluculateModelをnewする時に、Windowのタグを引数にして、CaluculateModelの_dialogServiceのWindowGuidにセット
- これにより、Windowのタグと、Modelの_dialogServiceのGuidとが一致する。
- そのDialogService経由でダイアログを表示する時は、一致するGuidがTagにセットされているWindowを検索し、そのWindowをオーナーにする。
public IDialogServiceView()
{
InitializeComponent();
Tag = _dialogService.WindowGuid; //for show OnWindow
}
private void CaluculateButton_Click(object sender, RoutedEventArgs e)
{
var cls = new CaluculateModel(this.Tag.ToString());
cls.Add(1, 2);
}
public CaluculateModel(string windowGuid)
{
_dialogService.WindowGuid = windowGuid;
}
ModelのDialogServiceのWindowGuidを、ViewのWindowにセットする例
理屈では、次の通りで良い。
- Viewで、ModelのDialogServiceのWindowGuidを取得する。
- Viewで、そのGuidを、Windowのタグと、Viewの_dialogServiceのWindowGuidにセット
例外発生の可能性
if (owner is not null) this.Owner = owner;
のownerはWindowです。 Windowが表示されていない時などの、ある条件下で、例外になる可能性があります。
次のようなコードに変更して、例外にならないように変更しました。
if (owner is not null && PresentationSource.FromVisual(owner) is not null) this.Owner = owner;
参考
機能作成方針
WPF用のメッセージボックスは、多く作成されています。ただ、次の要件に見合う物がなかったので、作成しました。
- メッセージボックスが表示されたと、認識しやすいこと。
- メッセージの追加情報は、隠しておいて、知りたい時は表示する。→ 余分な情報があると分かりにくくなる。しかし、必要になる時があるので、その時は、表示したい。
- メッセージはコピーできる。
備考
- WPF 対応の MessageBox クラスを参考にしました。
参照
次の記事で、DIコンテナの利用の仕方・OwnerのWindowを指定する方法・ユニットテスト、を解説しています。
この記事の履歴
- 2022-02-06 この記事を公開。Ver 1.0を公開。
- 2024-09-15 Ver 2.0を公開したので、記事を修正