WPF MessageBoxサンプル作成ツール

Windows 標準の MessageBox をリアルタイムにシミュレート。 GitHub でビルド済み exe を公開中。開発環境なしで UI の仕様検討を即座に開始。

概要:対話的な MessageBox シミュレーター

WPF MessageBox サンプル作成ツールは、WPF の標準 MessageBox を直感的にカスタマイズし、その場で実際の挙動を確認できるプロトタイピングアプリです。 本文、タイトル、ボタン、アイコン、既定の結果、表示オプションを設定し、その設定のまま実際の MessageBox を表示できます。

本ツールは GitHub の Release ページにてビルド済みの実行ファイル(.exe)を公開しているため、Visual Studio などの開発環境がインストールされていない PC でもダウンロードするだけで利用できます。 ただし配布しているビルドはフレームワーク依存のため、対応する x64 版の .NET デスクトップ ランタイムは導入済みである必要があります。 詳細は後述の動作環境を参照してください。

WPF MessageBoxサンプル作成ツールのメイン画面。本文、タイトル、ボタン、アイコン、オプションの入力欄が並ぶ

開発背景:「環境構築の壁」を取り払うために

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 つもありません。

主な用途

動作環境

ダウンロードとリポジトリ

実行ファイルのダウンロードとソースコードの閲覧は GitHub から行えます。

🚀 ビルド済み exe をダウンロード(GitHub Releases)

GitHub リポジトリを見る(ソースコード)