WPF的Window.ShowDialog
方法返回一个可以为空的布尔值。 CommonDialog.ShowDialog
也是如此。
现在,我理解这些将返回false的情况(用户单击取消或按下Esc),以及何时返回true(代码集Window.DialogResult
为true,可能是为了响应OK单击)。但是null?
我的第一个想法是单击标题栏的“关闭”按钮可能会返回null。但是文档说明了(我通过测试证实)the title-bar Close button is treated as a Cancel。
那么,Window.ShowDialog
或CommonDialog.ShowDialog
何时会返回null?
答案 0 :(得分:23)
该方法始终返回true或false,并且它始终等于窗口关闭时的DialogResult属性。
但是在关闭窗口之前,DialogResult属性为null,而另一个线程可以检查该属性。所以有意义的是,返回值是一个可以为空的布尔值来匹配属性,即使它实际上从不为null。
答案 1 :(得分:2)
如果我在按钮的Click事件中返回DialogResult = null,则窗口保持打开状态。
private void OkButton_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
if ( btn != null )
{
// forces all control to update...
btn.Focus();
}
// TEST IF OK TO CLOSE
bool rc = _vm.ProcessOkCommand();
if (rc)
{
DialogResult = true;
}
else
{
DialogResult = null;
}
}
<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/>
答案 2 :(得分:0)
我可以举一个我刚刚遇到的例子。当您执行以下步骤时,Window.ShowDialog()
将返回null:
Application
的所有窗口。Window
关键字实例化的所有其他new
对象。Window
并尝试在其上调用Window.ShowDialog()
。它将返回null。这是因为,大概您没有新的对话框可以绑定到的Window
,以便像拥有最高窗口状态的对话框那样工作。