34

WPF 的Window.ShowDialog方法返回一个可为空的布尔值。也是如此CommonDialog.ShowDialog

现在,我了解这些将返回 false(用户单击取消或按 Esc)以及何时返回 true(代码设置Window.DialogResult为 true,可能是响应单击 OK)的情况。但是空?

我的第一个想法是单击标题栏的关闭按钮可能会返回 null。但是文档声明(我通过测试确认)标题栏关闭按钮被视为 Cancel

那么什么时候会Window.ShowDialogCommonDialog.ShowDialog曾经返回 null 呢?

4

4 回答 4

27

该方法始终返回 true 或 false,这始终等于窗口关闭时的 DialogResult 属性。

但是 DialogResult 属性在窗口关闭之前为空,另一个线程可以检查该属性。所以返回值是一个可以为空的布尔值来匹配属性是有道理的,即使它实际上从来不是空的。

于 2009-06-13T06:32:47.880 回答
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"/>
于 2010-03-18T04:40:53.613 回答
2

我可以举一个我刚刚遇到的例子。Window.ShowDialog()执行以下步骤时将返回 null:

  • 您首先关闭所有Application的窗口。
  • Window到目前为止已使用关键字实例化的所有其他对象new都已关闭。
  • 您尝试实例化一个新的Window并尝试调用Window.ShowDialog()它。它将返回空值。

这是因为,大概,您没有Window新对话框可以绑定到的现有对象,以便表现得像拥有最顶层窗口状态的对话框。

于 2019-04-09T17:49:34.297 回答
1

在非常特殊的情况下调用window.ShowDialog()可以返回 null,这是我偶然遇到的:

如果window.Closing通过以下方式捕获事件

        var window = new DialogTestWindow();
        window.Closing += (o, e) => { e.Cancel = true; window.Hide(); };
        MessageBox.Show(window.ShowDialog().ToString());

然后设置DialogResult = trueDialogResult = false从对话窗口将导致window.ShowDialog()调用返回 null。从对话窗口调用Hide()将导致它返回 false。

编辑: Window 源代码中的注释清楚地表明,其意图是调用ShowDialog()永远不应该返回 null。但是,当从Closing事件中调用 Hide() 时,应该防止这种情况发生的各种检查失败:Hide()设置_dialogResult为 false,但随后检查窗口的关闭是否已被取消,然后将其设置为 null。

于 2022-01-11T13:43:21.070 回答