Windows Presentation Foundation (WPF) には、独自のダイアログ ボックスを設計する方法が用意されています。 ダイアログ ボックスはウィンドウですが、特定の意図とユーザー エクスペリエンスがあります。 この記事では、ダイアログ ボックスのしくみと、作成して使用できるダイアログ ボックスの種類について説明します。 ダイアログ ボックスは、次の用途に使用されます。
- 特定の情報をユーザーに表示します。
- ユーザーから情報を収集します。
- 情報の表示と収集の両方。
- 印刷ウィンドウなどのオペレーティング システム プロンプトを表示します。
- ファイルまたはフォルダーを選択します。
これらの種類のウィンドウは 、ダイアログ ボックスと呼ばれます。 ダイアログ ボックスは、モーダルとモードレスの 2 つの方法で表示できます。
モーダル ダイアログ ボックスをユーザーに表示することは、ユーザーがダイアログ ボックスを閉じるまで、アプリケーションが操作を中断する手法です。 これは通常、プロンプトまたはアラートの形式で提供されます。 ダイアログ ボックスが閉じられるまで、アプリケーション内の他のウィンドウを操作することはできません。 モーダル ダイアログ ボックスが閉じられると、アプリケーションは続行されます。 最も一般的なダイアログ ボックスは、開いているファイルを表示したり、ファイルを保存したり、プリンター ダイアログを表示したり、何らかの状態でユーザーにメッセージを送信したりするために使用されます。
モードレス ダイアログ ボックスでは、開いている間にユーザーが他のウィンドウをアクティブ化できなくなります。 たとえば、ユーザーが文書内の特定の単語の出現箇所を見つけたい場合、メイン ウィンドウでダイアログ ボックスが開き、探している単語をユーザーに尋ねることがよくあります。 アプリケーションはユーザーがドキュメントを編集できないようにする必要がないため、ダイアログ ボックスをモーダルにする必要はありません。 モードレス ダイアログ ボックスには、少なくともダイアログ ボックスを閉じる [ 閉じる ] ボタンが用意されています。 その他のボタンは、特定の機能を実行するために用意されている場合があります。たとえば、[ 次を検索 ] ボタンを使用して単語検索内の次の単語を検索します。
WPF では、メッセージ ボックス、共通のダイアログ ボックス、カスタム ダイアログ ボックスなど、いくつかの種類のダイアログ ボックスを作成できます。 この記事では、それぞれについて説明し、 ダイアログ ボックスのサンプル では一致する例を示します。
メッセージ ボックス
メッセージ ボックス は、テキスト情報を表示したり、ユーザーがボタンを使用して意思決定を行えるようにしたりするために使用できるダイアログ ボックスです。 次の図は、質問をするメッセージ ボックスを示し、ユーザーに質問に回答するための 3 つのボタンを提供します。
メッセージ ボックスを作成するには、MessageBox クラスを使用します。 MessageBox では、メッセージ ボックスのテキスト、タイトル、アイコン、ボタンを構成できます。
詳細については、「 メッセージ ボックスを開く方法」を参照してください。
一般的なダイアログ ボックス
Windows には、ファイルの選択や印刷のためのダイアログ ボックスなど、すべてのアプリケーションに共通するさまざまな種類の再利用可能なダイアログ ボックスが実装されています。
これらのダイアログ ボックスはオペレーティング システムによって提供されるため、オペレーティング システムで実行されるすべてのアプリケーション間で共有されます。 これらのダイアログ ボックスは、一貫したユーザー エクスペリエンスを提供し、 一般的なダイアログ ボックスと呼ばれます。 ユーザーは 1 つのアプリケーションで共通のダイアログ ボックスを使用するため、他のアプリケーションでそのダイアログ ボックスを使用する方法を学習する必要はありません。
WPF は、開いているファイルをカプセル化し、ファイルを保存し、フォルダーを開き、一般的なダイアログ ボックスを印刷し、使用するマネージド クラスとして公開します。
一般的なダイアログ ボックスの詳細については、次の記事を参照してください。
- 共通のダイアログ ボックスを表示する方法
- [ファイルを開く] ダイアログ ボックスを表示する
- [ファイルの保存] ダイアログ ボックスを表示する
- [フォルダーを開く] ダイアログ ボックス
- [印刷] ダイアログ ボックスを表示する
カスタム ダイアログ ボックス
一般的なダイアログ ボックスは便利であり、可能な場合は使用する必要があります。ドメイン固有のダイアログ ボックスの要件はサポートされていません。 このような場合は、独自のダイアログ ボックスを作成する必要があります。 ご覧のように、ダイアログ ボックスは特別な動作を持つウィンドウです。 Window は、これらの動作を実装し、ウィンドウを使用してカスタムモーダルおよびモードレスダイアログボックスを作成します。
独自のダイアログ ボックスを作成するときに考慮すべき設計上の考慮事項は多数あります。 アプリケーション ウィンドウとダイアログ ボックスの両方に、同じ基底クラスの共有などの類似点が含まれていますが、ダイアログ ボックスは特定の目的に使用されます。 通常、ユーザーに何らかの情報または応答を求める必要がある場合は、ダイアログ ボックスが必要です。 通常、アプリケーションはダイアログ ボックス (モーダル) が表示されている間に一時停止し、アプリケーションの残りの部分へのアクセスを制限します。 ダイアログ ボックスが閉じられると、アプリケーションは続行されます。 ただし、対話をダイアログ ボックスだけに限定することは要件ではありません。
WPF ウィンドウを閉じると、再度開くことはありません。 カスタム ダイアログ ボックスは WPF ウィンドウであり、同じ規則が適用されます。 ウィンドウを閉じる方法については、「ウィンドウ またはダイアログ ボックスを閉じる方法」を参照してください。
ダイアログ ボックスの実装
ダイアログ ボックスを設計するときは、次の推奨事項に従って適切なユーザー エクスペリエンスを作成します。
❌ ダイアログ ウィンドウを乱雑にしないでください。 ダイアログ エクスペリエンスは、ユーザーがデータを入力したり、選択したりすることです。
✔️ [ OK] ボタンを指定してウィンドウを閉じます。
✔️ [OK] ボタンの IsDefault プロパティを true
に設定すると、ユーザーは Enter キーを押してウィンドウを受け入れて閉じることができます。
✔️ ユーザーがウィンドウを閉じて続行しないことを示すことができるように、[ キャンセル] ボタンを追加することを検討してください。
✔️ [キャンセル ] ボタンの IsCancel プロパティを true
に設定すると、ユーザーは Esc キーを押してウィンドウを閉じることができます。
✔️ ウィンドウのタイトルを設定して、ダイアログが何を表すか、またはユーザーがダイアログで何をすべきかを正確に記述します。
✔️ ウィンドウの最小幅と高さの値を設定して、ユーザーがウィンドウのサイズを小さくなりすぎないようにします。
✔️ ShowInTaskbar が false
に設定されている場合は、ウィンドウのサイズを変更する機能を無効にすることを検討してください。 サイズ変更を無効にするには、ResizeModeをNoResizeに設定します。
次のコードは、この構成を示しています。
<Window x:Class="Dialogs.Margins"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Change Margins"
Closing="Window_Closing"
MinHeight="200"
MinWidth="300"
SizeToContent="WidthAndHeight"
ResizeMode="NoResize"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner"
FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">
<Grid Margin="10">
<Grid.Resources>
<!-- Default settings for controls -->
<Style TargetType="{x:Type Label}">
<Setter Property="Margin" Value="0,3,5,5" />
<Setter Property="Padding" Value="0,0,0,5" />
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,0,0,5" />
</Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Width" Value="70" />
<Setter Property="Height" Value="25" />
<Setter Property="Margin" Value="5,0,0,0" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!-- Left,Top,Right,Bottom margins-->
<Label Grid.Column="0" Grid.Row="0">Left Margin:</Label>
<TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0" />
<Label Grid.Column="0" Grid.Row="1">Top Margin:</Label>
<TextBox Name="topMarginTextBox" Grid.Column="1" Grid.Row="1"/>
<Label Grid.Column="0" Grid.Row="2">Right Margin:</Label>
<TextBox Name="rightMarginTextBox" Grid.Column="1" Grid.Row="2" />
<Label Grid.Column="0" Grid.Row="3">Bottom Margin:</Label>
<TextBox Name="bottomMarginTextBox" Grid.Column="1" Grid.Row="3" />
<!-- Accept or Cancel -->
<StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Name="okButton" Click="okButton_Click" IsDefault="True">OK</Button>
<Button Name="cancelButton" IsCancel="True">Cancel</Button>
</StackPanel>
</Grid >
</Window>
上の XAML では、次の図のようなウィンドウが作成されます。
ダイアログ ボックスを開く UI 要素
ダイアログ ボックスのユーザー エクスペリエンスは、メニュー バーまたはそれを開くウィンドウのボタンにも拡張されます。 メニュー項目またはボタンで、ユーザーがダイアログ ボックスを操作する必要がある関数を実行してから関数を続行する場合、コントロールはヘッダー テキストの末尾に省略記号を使用する必要があります。
<MenuItem Header="_Margins..." Click="formatMarginsMenuItem_Click" />
<!-- or -->
<Button Content="_Margins..." Click="formatMarginsButton_Click" />
[概要]ダイアログ ボックスなど、ユーザーの操作を必要としないダイアログ ボックスを表示する機能をメニュー項目やボタンで実行する場合、省略記号は使用しません。
メニュー項目
メニュー項目は、関連するテーマにグループ化されたアプリケーション アクションをユーザーに提供する一般的な方法です。 あなたはおそらく、多くの異なるアプリケーションで[ ファイル] メニューを見てきました。 一般的なアプリケーションでは、[ ファイル ] メニュー項目には、ファイルの保存、ファイルの読み込み、ファイルの印刷を行う方法が用意されています。 アクションがモーダル ウィンドウを表示する場合、ヘッダーには通常、次の図に示すように省略記号が含まれます。
メニュー項目の 2 つには省略記号 ( ...
) があります。 これにより、ユーザーがメニュー項目を選択するとモーダル ウィンドウが表示され、ユーザーがアプリケーションを閉じるまでアプリケーションが一時停止することをユーザーが識別するのに役立ちます。
この設計手法は、ユーザーが期待する内容をユーザーに伝える簡単な方法です。
ボタン
メニュー項目セクションで説明されているのと同じ原則に従うことができます。 ボタン テキストの省略記号を使用して、ユーザーがボタンを押すとモーダル ダイアログが表示されることを示します。 次の図では、2 つのボタンがあり、ダイアログ ボックスを表示するボタンを簡単に理解できます。
結果を返す
別のウィンドウ (特にモーダル ダイアログ ボックス) を開くと、状態と情報を呼び出し元のコードに返すのに最適な方法です。
モーダル ダイアログ
ShowDialog()を呼び出してダイアログ ボックスが表示されると、ダイアログ ボックスを開いたコードは、ShowDialog
メソッドが戻るまで待機します。 メソッドが戻ると、メソッドを呼び出したコードは、処理を続けるか停止するかを決める必要があります。 ユーザーは通常、ダイアログ ボックスの [OK] または [キャンセル ] ボタンを押してこれを示します。
[OK] ボタンを押すと、ShowDialog
はtrue
を返すように設計され、キャンセル ボタンはfalse
を返すように設計されている必要があります。 これは、ボタンが押されたときに DialogResult プロパティを設定することによって実現されます。
private void okButton_Click(object sender, RoutedEventArgs e) =>
DialogResult = true;
private void cancelButton_Click(object sender, RoutedEventArgs e) =>
DialogResult = false;
Private Sub okButton_Click(sender As Object, e As RoutedEventArgs)
DialogResult = True
End Sub
Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
DialogResult = False
End Sub
DialogResult プロパティは、ダイアログ ボックスがShowDialog()と共に表示された場合にのみ設定できます。
DialogResult
プロパティが設定されると、ダイアログ ボックスが閉じます。
ボタンの IsCancel プロパティが true
に設定されていて、ウィンドウが ShowDialog()で開かれている場合、 ESC キーはウィンドウを閉じ、 DialogResult
を false
に設定します。
ダイアログ ボックスを閉じる方法の詳細については、「 ウィンドウまたはダイアログ ボックスを閉じる方法」を参照してください。
応答の処理
ShowDialog()は、ユーザーがダイアログ ボックスを受け入れたかキャンセルしたかを示すブール値を返します。 ユーザーに何かを警告しているが、ユーザーが決定を下したりデータを提供したりする必要がない場合は、応答を無視できます。 応答は、 DialogResult プロパティを確認して検査することもできます。 次のコードは、応答を処理する方法を示しています。
var dialog = new Margins();
// Display the dialog box and read the response
bool? result = dialog.ShowDialog();
if (result == true)
{
// User accepted the dialog box
MessageBox.Show("Your request will be processed.");
}
else
{
// User cancelled the dialog box
MessageBox.Show("Sorry it didn't work out, we'll try again later.");
}
Dim marginsWindow As New Margins
Dim result As Boolean? = marginsWindow.ShowDialog()
If result = True Then
' User accepted the dialog box
MessageBox.Show("Your request will be processed.")
Else
' User cancelled the dialog box
MessageBox.Show("Sorry it didn't work out, we'll try again later.")
End If
marginsWindow.Show()
モードレス ダイアログ
モードレスのダイアログ ボックスを表示するには、Show()を呼び出します。 ダイアログ ボックスには、少なくとも [閉じる] ボタンが表示されます。 その他のボタンや対話型の要素を指定して、特定の関数を実行できます。たとえば、[ 次を検索 ] ボタンを使用して単語検索で次の単語を検索できます。
モードレス ダイアログ ボックスでは呼び出し元のコードの続行がブロックされないため、結果を返す別の方法を指定する必要があります。 次のいずれかを実行することができます。
- ウィンドウでデータ オブジェクト プロパティを公開します。
- 呼び出し元のコードで Window.Closed イベントを処理します。
- ユーザーがオブジェクトを選択するか、特定のボタンを押したときに発生するイベントをウィンドウに作成します。
次の例では、 Window.Closed イベントを使用して、ダイアログ ボックスが閉じたときにユーザーにメッセージ ボックスを表示します。 表示されるメッセージは、閉じたダイアログ ボックスのプロパティを参照します。 ダイアログ ボックスを閉じる方法の詳細については、「 ウィンドウまたはダイアログ ボックスを閉じる方法」を参照してください。
var marginsWindow = new Margins();
marginsWindow.Closed += (sender, eventArgs) =>
{
MessageBox.Show($"You closed the margins window! It had the title of {marginsWindow.Title}");
};
marginsWindow.Show();
Dim marginsWindow As New Margins
AddHandler marginsWindow.Closed, Sub(sender As Object, e As EventArgs)
MessageBox.Show($"You closed the margins window! It had the title of {marginsWindow.Title}")
End Sub
marginsWindow.Show()
こちらも参照ください
.NET Desktop feedback