谁能想到一个很好的解释,即对话的结果在 WPF 中是一个可以为空的布尔值?这一直让我感到困惑。在 WinForms 中,它是一种枚举类型,这对我来说更有意义。
5 回答
该DialogResult
属性是在Window
类上定义的。并非所有Window
s 都是对话框。因此,该属性并不与所有窗口相关。AWindow
已经通过Show()
而不是ShowDialog()
will 显示(大概,除非你出于某种原因设置它)有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
of false
,而非对话框有一个null DialogResult
.
在我看来,这样做是因为在大多数情况下,您不需要像 Retry 或 Ignore 这样的通用专门选项。
如果您需要的不仅仅是确定/取消,您应该使用某种任务对话框,例如带有书面答案。这样,您就不会局限于几十年前有人想到的几个枚举值,而且 DialogResult 只是基本使用的正/负,您可以实现自己的特定于您的高级需求的属性。因此只需要 true/false,null 表示窗口还没有关闭(还没有为属性分配值)。
如果您的对话框不仅仅是用户应该回答的问题(例如输入表单),您通常最好使用 OK/Cancel,因此您不需要更多值。
根据MSDN 文档:
当对话框显示但既不接受也不取消时,DialogResult 为空。
但我不确定这会如何发生,除非您正在处理访问对话框的多个线程。
当以下情况之一发生时,文档说是错误的:
- 按 ALT+F4。
- 单击关闭按钮。
- 从系统菜单中选择关闭。
ShowDialog 将始终返回 true 或 false。DialogResult 只会在对话框打开时采用 null 状态。从 null 转换为 true 或 false 将关闭对话框并返回对 ShowDialog 的原始调用。
IMO 这是因为 DialogResult 并不总是被使用。你看,只有当窗口被它的 ShowDialog() 方法调用时,你才能设置 DialogResult,如果你用它的 Show() 方法调用它,并尝试将 DialogResult 设置为任何东西,它会抛出一个 InvalidOperationException。所以我认为这就是它可以为空的原因,如果你用 Show() 方法调用窗口,它将为空,如果你用 ShowDialog() 调用它,这取决于你。