ダイアログの結果がWPFでnull許容のブール値であるという事実について、誰かが良い説明を思いつくことができますか?これはいつも私を困惑させてきました。WinFormsでは、それは列挙型であり、それは私にとってはるかに理にかなっています。
5 に答える
DialogResult
プロパティはクラスで定義されますWindow
。すべてWindow
がダイアログであるとは限りません。したがって、プロパティはすべてのウィンドウに関連しているわけではありません。(おそらく、何らかの理由で設定しない限り)ではなくWindow
経由で表示されたAは。Show()
ShowDialog()
DialogResult = null
簡単な例を次に示します。
Window1.xaml:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Button Name="b1">Show</Button>
<Button Name="b2">ShowDialog</Button>
</StackPanel>
</Window>
Window1.xaml.cs:
using System.Windows;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
b1.Click += new RoutedEventHandler(b1_Click);
b2.Click += new RoutedEventHandler(b2_Click);
}
void b1_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.Closed += delegate
{
MessageBox.Show("" + w.DialogResult);
};
w.Show();
}
void b2_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.ShowDialog();
MessageBox.Show("" + w.DialogResult);
}
}
}
ウィンドウを閉じると、ダイアログにはがDialogResult
、false
非ダイアログにはが含まれていることがわかりますnull DialogResult
。
私の意見では、これが行われたのは、ほとんどの場合、再試行や無視などの一般化された特殊なオプションは必要ないためです。
OK /キャンセル以上のものが必要な場合は、たとえば、回答を書き出すなど、何らかのタスクダイアログを使用することになっています。そうすれば、数十年前に誰かが考えたいくつかの列挙値に制限されず、DialogResultは基本的な使用に対して正/負であり、高度なニーズに固有の独自のプロパティを実装できます。したがって、true / falseのみが必要であり、nullはウィンドウがまだ閉じられていないことを示します(プロパティに値がまだ割り当てられていません)。
ユーザーが回答する必要のある質問以外のダイアログ(入力フォームなど)がある場合は、通常、[OK] / [キャンセル]を使用する方がよいため、これ以上の値は必要ありません。
MSDNのドキュメントによると:
ダイアログボックスが表示されているが、受け入れもキャンセルもされていない場合、DialogResultはnullです。
ただし、ダイアログにアクセスする複数のスレッドを処理していない限り、これがどのように発生するかはわかりません。
ドキュメントには、次のいずれかが発生した場合は誤りであると記載されています。
- ALT+F4を押します。
- [閉じる]ボタンをクリックします。
- [システム]メニューから[閉じる]を選択します。
ShowDialogは常にtrueまたはfalseを返します。DialogResultは、ダイアログが開いているときにのみnull状態になります。nullからtrueまたはfalseに移行すると、ダイアログが閉じ、ShowDialogへの元の呼び出しが返されます。
IMOこれは、DialogResultが常に使用されるとは限らないためです。ご覧のとおり、ウィンドウがShowDialog()メソッドによって呼び出された場合にのみ、DialogResultを設定できます。また、Show()メソッドを使用してウィンドウを呼び出し、DialogResultを何かに設定しようとすると、InvalidOperationExceptionがスローされます。したがって、それがnull許容の理由だと思います。Show()メソッドを使用してウィンドウを呼び出す場合はnullになり、ShowDialog()を使用して呼び出す場合はユーザー次第です。