WPF MessageBoxサンプル作成ツール
Windows 標準の MessageBox をリアルタイムにシミュレート。 GitHub でビルド済み exe を公開中。開発環境なしで UI の仕様検討を即座に開始。
概要:対話的な MessageBox シミュレーター
WPF MessageBox サンプル作成ツールは、WPF の標準 MessageBox を直感的にカスタマイズし、その場で実際の挙動を確認できるプロトタイピングアプリです。 本文、タイトル、ボタン、アイコン、既定の結果、表示オプションを設定し、その設定のまま実際の MessageBox を表示できます。
本ツールは GitHub の Release ページにてビルド済みの実行ファイル(.exe)を公開しているため、Visual Studio などの開発環境がインストールされていない PC でもダウンロードするだけで利用できます。 ただし配布しているビルドはフレームワーク依存のため、対応する x64 版の .NET デスクトップ ランタイムは導入済みである必要があります。 詳細は後述の動作環境を参照してください。

開発背景:「環境構築の壁」を取り払うために
WPF 開発において、エラーメッセージや確認ダイアログの挙動を確認するためだけにコードを書き、リビルドを繰り返すのは非効率な作業です。
特に、開発者以外のデザイナーや設計者が「実際の挙動を確認したい」と思っても、ソースコードしか公開されていないツールでは、ビルド環境の構築という高いハードルがありました。 そこで本ツールでは、誰もがすぐに動かせるよう実行形式での配布を行っています。 WPF だけで作り、サードパーティ製のライブラリも独自のスタイルも使っていないため、最新版 v1.0.0.2 のアプリの ZIP は約 200 KB です。
設定できる項目
本ツールが呼び出す MessageBox.Show のオーバーロードの引数を、それぞれ独立した入力として公開しています。 そのため、コードを書き換えてリビルドすることなく組み合わせを試せます。 なお、第 1 引数に所有者となる Window を受け取るオーバーロードは対象外で、本ツールは所有者を設定しません。
| 項目 | 型 | 効果 |
|---|---|---|
| 本文 | string |
ダイアログの本文です。長文がどこで折り返され、ダイアログの幅がどう変わるかの確認に使えます。 |
| タイトル | string |
タイトルバーに表示される文字列です。 |
| ボタン | MessageBoxButton |
ボタンの組み合わせです。選択肢は、実行しているランタイムの列挙型のメンバーです。.NET 8 用のビルドでは OK・OKCancel・YesNoCancel・YesNo の 4 つ、.NET 10 用のビルドではこれに AbortRetryIgnore・RetryCancel・CancelTryContinue を加えた 7 つから選べます。 |
| アイコン | MessageBoxImage |
本文の横に表示されるシステムアイコンです。9 つのメンバー名をすべて選択できます。 |
| 既定の結果 | MessageBoxResult |
ダイアログを開いた時点で既定になるボタン、すなわち Enter キーで確定されるボタンです。 本ツールでは列挙型のすべての値(.NET 10 では 10 個)を選べますが、指定が効くのは、選んだボタン構成にそのボタンが含まれている場合だけです。 .NET 8.0.31 と 10.0.10 で、すべてのボタン構成とすべての値の組み合わせを表示したところ、表示されていないボタンを指定すると、必ず先頭のボタンが既定になりました。 |
| オプション | MessageBoxOptions |
右寄せ表示や右から左への読み取り順序といった、表示に関するオプションです。 選択肢は列挙型の 5 つのメンバーで、1 つずつ選ぶため、フラグを組み合わせることはできません。 |
このツールで分かること:アイコン名は 9 つ、実際のアイコンは 4 種類
MessageBoxImage には 9 つのメンバーがあるため、9 種類のアイコンを選べるように見えます。 しかし実際にはそうではありません。 いくつかのメンバーは同じ数値を共有しており、実行時には区別できません。 列挙型が同一の Win32 フラグに対して別名を用意している、というのが実態です。
| 列挙型のメンバー | 値 | 実際に表示されるアイコン |
|---|---|---|
None |
0 | アイコンなし |
Error / Hand / Stop |
16 | 赤い円の中の白い × |
Question |
32 | 円の中の疑問符 |
Exclamation / Warning |
48 | 黄色い三角形の中の感嘆符 |
Asterisk / Information |
64 | 円の中の小文字の i |
この重複はコードにも現れます。 .NET 8.0.31 と 10.0.10 では、Enum.GetValues の値を文字列にすると、Hand が 3 回、Exclamation と Asterisk が 2 回ずつ並びました。 複数の名前を持つ値は文字列にすると 1 つの名前にしかならず、どの名前になるかは .NET で規定されていないため、別のランタイムでは違う名前になりえます。 いずれにしても、そのまま ComboBox にバインドすると同じ名前が複数並ぶため、本ツールはアイコンの一覧を 9 つの名前から作っています。
Error・Hand・Stop を順に選び、毎回まったく同じダイアログが表示されるのを見れば、 列挙型の定義を読んでいるときに湧く疑問がその場で解消します。 同時に、この 3 つのどれを使うかはコードの読みやすさの問題であって、ユーザーに見える違いではないことも分かります。
もう 1 点、使う前に知っておく価値のある注意があります。 Microsoft は Question アイコンを非推奨としています。 疑問符はメッセージの種類を示しておらず、ヘルプ機能と誤解されうる、というのがその理由です。 現在も列挙型に残っているのは後方互換性のためです。 確認ダイアログには Warning を使うか、アイコンを付けないほうが無難です。
実測した挙動
このページの列挙型のメンバー、アイコンの名前、既定のボタンは、.NET 8.0.31 と .NET 10.0.10 / Windows 11 で実際に動かして確かめたものです。計測には、このサイトのスクリーンショット生成ツールの MessageBoxSampleCreatorScene を使いました。ランタイムごとに小さなプログラムをビルドし、本ツールと同じく所有者を指定せずに MessageBox.Show を呼び、すべてのボタン構成とすべての MessageBoxResult の組み合わせを表示しています。既定のボタンはダイアログのボタンのコントロール ID で読んでいるため、ボタンの文字の言語には左右されません。入力は送っておらず、各ダイアログは先頭のボタンをウィンドウメッセージで押して閉じました。
| 条件 | 計測値 |
|---|---|
| .NET 8.0.31: MessageBoxButton | OK, OKCancel, YesNoCancel, YesNo |
| .NET 8.0.31: MessageBoxResult | None, OK, Cancel, Yes, No |
| .NET 8.0.31: MessageBoxOptions | None, DefaultDesktopOnly, RightAlign, RtlReading, ServiceNotification |
| .NET 8.0.31: Enum.GetValues(MessageBoxImage) の文字列 | None, Hand, Hand, Hand, Question, Exclamation, Exclamation, Asterisk, Asterisk |
| .NET 10.0.10: MessageBoxButton | OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, RetryCancel, CancelTryContinue |
| .NET 10.0.10: MessageBoxResult | None, OK, Cancel, Abort, Retry, Ignore, Yes, No, TryAgain, Continue |
| .NET 10.0.10: MessageBoxOptions | None, DefaultDesktopOnly, RightAlign, RtlReading, ServiceNotification |
| .NET 10.0.10: Enum.GetValues(MessageBoxImage) の文字列 | None, Hand, Hand, Hand, Question, Exclamation, Exclamation, Asterisk, Asterisk |
ツールの選択肢の元になる列挙型のメンバー。.NET 8.0.31 と .NET 10.0.10 / Windows 11 で計測。
| ボタンの組(表示されるボタン) | defaultResult → 既定のボタン |
|---|---|
| .NET 8.0.31: OK (OK) | OK → OK |
| .NET 8.0.31: OKCancel (OK, Cancel) | OK → OK、Cancel → Cancel |
| .NET 8.0.31: YesNoCancel (Yes, No, Cancel) | Cancel → Cancel、Yes → Yes、No → No |
| .NET 8.0.31: YesNo (Yes, No) | Yes → Yes、No → No |
| .NET 8.0.31: None または組に無い結果 → 最初のボタン | 12 件中 12 件(表示した 20 個のダイアログのうち) |
| .NET 10.0.10: OK (OK) | OK → OK |
| .NET 10.0.10: OKCancel (OK, Cancel) | OK → OK、Cancel → Cancel |
| .NET 10.0.10: AbortRetryIgnore (Abort, Retry, Ignore) | Abort → Abort、Retry → Retry、Ignore → Ignore |
| .NET 10.0.10: YesNoCancel (Yes, No, Cancel) | Cancel → Cancel、Yes → Yes、No → No |
| .NET 10.0.10: YesNo (Yes, No) | Yes → Yes、No → No |
| .NET 10.0.10: RetryCancel (Retry, Cancel) | Cancel → Cancel、Retry → Retry |
| .NET 10.0.10: CancelTryContinue (Cancel, TryAgain, Continue) | Cancel → Cancel、TryAgain → TryAgain、Continue → Continue |
| .NET 10.0.10: None または組に無い結果 → 最初のボタン | 54 件中 54 件(表示した 70 個のダイアログのうち) |
ボタン構成と defaultResult ごとの既定のボタン。.NET 8.0.31 と .NET 10.0.10 / Windows 11 で計測。
ツールの作り
Show MessageBox. ボタンは、ビューモデルが持つ 6 つの値で MessageBox.Show(本文, タイトル, ボタン, アイコン, 既定の結果, オプション) を 1 回呼ぶだけです。 ボタン構成・既定の結果・オプションの一覧は、Enum.GetValues の結果を ObjectDataProvider でバインドしたもので、ビルドが対象とするランタイムの列挙型に従います。 .NET 10 用のビルドにだけ、.NET 8 用のビルドに無いボタン構成が並ぶのはこのためです。 アイコンの一覧だけは、前述のとおり例外です。
画面は WPF の既定のスタイルのままで、XAML に Style は 1 つもありません。
主な用途
- 仕様レビューでダイアログの文言を確定する。 口頭で説明する代わりに実物を表示し、その場で本文とボタン構成の合意を取れます。
- 長い本文の表示結果を確認する。 コード上では問題なく見える文章でも、表示すると不自然な位置で折り返されたり、ダイアログが横に伸びたりします。 実際の文字列を貼り付ければ結果がすぐ分かります。
- Enter キーでどのボタンが押されるかを確認する。 破壊的な操作の確認ダイアログで既定の結果を誤ると、そのまま使い勝手の不具合になります。 コードを書く前にフォーカス位置を確認できます。
- 右から左のレイアウトを検証する。 オプションで RTL の読み取り順序を指定できます。通常は確認しづらい表示です。
動作環境
- OS: Windows(x64)
- ランタイム: 最新版 v1.0.0.2 のアプリの ZIP には、.NET 8 用と .NET 10 用の win-x64 ビルドが両方入っています。 いずれもフレームワーク依存の配置でランタイムを同梱していないため、 対応する x64 版の .NET デスクトップ ランタイムが別途必要です。 導入済みのバージョンに合わせて、どちらかの実行ファイルを選んでください。
- UI フレームワーク: WPF、サードパーティ製の依存関係なし
ダウンロードとリポジトリ
実行ファイルのダウンロードとソースコードの閲覧は GitHub から行えます。