執筆者: 大野 元久

動作確認環境: Visual Studio 2008、Visual Studio 2010

更新日: 2011 年 1 月 7 日

Windows フォームでは、フォームに AcceptButton と CancelButton というプロパティがあります。これらのプロパティにボタンが設定されていると、ShowDialog でモーダル ダイアログとして呼び出されたときに、入力フォーカスの場所に関係なく、[Enter] キーや [Esc] キーを押すことで割り当てられたボタンを押したことになります。ここでは、WPF で同じ処理をする方法について解説します。

Code [XAML]

<Window x:Class="WpfApplication1.MyDialog"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MyDialog" Height="200" Width="300" ResizeMode="NoResize">
   <Canvas>
       <Label Content="Name:" Name="label1" Canvas.Left="40" Canvas.Top="30" />
       <TextBox Name="textBox1" Canvas.Left="95" Canvas.Top="32" Width="150" />
       <Button Content="OK" Name="button1" Width="75" Canvas.Left="40" Canvas.Top="100"
               IsDefault="True" Click="button1_Click" />
       <Button Content="Cancel" Name="button2" Width="75" Canvas.Left="160" Canvas.Top="100"
               IsCancel="True" />
   </Canvas>
</Window>

Code [C#]

public partial class MyDialog : Window
{
   public MyDialog()
   {
       InitializeComponent();
   }

   private void button1_Click(object sender, RoutedEventArgs e)
   {
       Status = MyDialogStatus.Normal;
       DialogResult = true;
   }

   public enum MyDialogStatus
   {
       Normal, Warning, FatalError
   }

   public MyDialogStatus Status { get; set; }
}

Code [VB]

Public Class MyDialog
   Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
       Status = MyDialogStatus.Normal
       DialogResult = True
   End Sub

   Public Enum MyDialogStatus
       Normal
       Warning
       FatalError
   End Enum

   Property Status As MyDialogStatus
End Class

実行結果


ポイント

Windows フォームの AcceptButton プロパティに相当する機能は、WPF では Button コントロールの IsDefault プロパティを使います。Windows フォームでは、Button の DialogResult プロパティに OK を設定しておくと、これが ShowDialog の戻り値として返されましたが、WPF では Button の Click イベント ハンドラーで DialogResult に true を代入します。

WPF では、ShowDialog の戻り値が bool 型 (Visual Basic の場合は Nullable (Of Boolean) 型) であり、Windows フォームの DialogResult のように Abort や Retry などの選択肢はありません。ダイアログ ボックスから true、false、null 以外の詳細な情報を返したい場合は、上記のように DialogResult 以外の独自プロパティを追加します。これにより、次のように呼び出して、DialogResult 以外の詳細情報を利用できるようになります。

Code [C#]

private void button1_Click(object sender, RoutedEventArgs e)
{
   var dlg = new MyDialog();
   if (dlg.ShowDialog() == true)
   {
       MessageBox.Show("Status: " + dlg.Status.ToString());
   }
}

Code [VB]

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
   Dim dlg As New MyDialog()
   Dim r As Nullable(Of Boolean)
   If dlg.ShowDialog() = True Then
       MessageBox.Show("Status: " + dlg.Status.ToString())
   End If
End Sub

また、Windows フォームの CancelButton プロパティに相当する機能は、Button の IsCancel プロパティを使います。IsCancel プロパティは、ウィンドウで [Esc] キーを押された場合に対応するだけでなく、DialogResult を false に設定します。これにより、ShowDialog でモーダル表示されているダイアログ ボックスを閉じて、呼び出し元に戻ります。


Code Recipe Code Recipe

ページのトップへ