18

谁能想到一个很好的解释,即对话的结果在 WPF 中是一个可以为空的布尔值?这一直让我感到困惑。在 WinForms 中,它是一种枚举类型,这对我来说更有意义。

4

5 回答 5

15

DialogResult属性是在Window类上定义的。并非所有Windows 都是对话框。因此,该属性并不与所有窗口相关。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);
        }
    }
}

当您关闭窗口时,您会注意到对话框有一个DialogResultof false,而非对话框有一个null DialogResult.

于 2009-06-12T15:26:31.973 回答
6

在我看来,这样做是因为在大多数情况下,您不需要像 Retry 或 Ignore 这样的通用专门选项。

如果您需要的不仅仅是确定/取消,您应该使用某种任务对话框,例如带有书面答案。这样,您就不会局限于几十年前有人想到的几个枚举值,而且 DialogResult 只是基本使用的正/负,您可以实现自己的特定于您的高级需求的属性。因此只需要 true/false,null 表示窗口还没有关闭(还没有为属性分配值)。

如果您的对话框不仅仅是用户应该回答的问题(例如输入表单),您通常最好使用 OK/Cancel,因此您不需要更多值。

于 2009-06-12T15:42:15.383 回答
2

根据MSDN 文档

当对话框显示但既不接受也不取消时,DialogResult 为空。

但我不确定这会如何发生,除非您正在处理访问对话框的多个线程。

当以下情况之一发生时,文档说是错误的:

  • 按 ALT+F4。
  • 单击关闭按钮。
  • 从系统菜单中选择关闭。
于 2009-06-12T15:25:25.580 回答
0

ShowDialog 将始终返回 true 或 false。DialogResult 只会在对话框打开时采用 null 状态。从 null 转换为 true 或 false 将关闭对话框并返回对 ShowDialog 的原始调用。

于 2009-06-12T15:40:51.220 回答
0

IMO 这是因为 DialogResult 并不总是被使用。你看,只有当窗口被它的 ShowDialog() 方法调用时,你才能设置 DialogResult,如果你用它的 Show() 方法调用它,并尝试将 DialogResult 设置为任何东西,它会抛出一个 InvalidOperationException。所以我认为这就是它可以为空的原因,如果你用 Show() 方法调用窗口,它将为空,如果你用 ShowDialog() 调用它,这取决于你。

于 2009-06-12T18:43:43.543 回答