为什么DialogResult在WPF中是一个可以为空的bool?

时间:2009-06-12 15:17:21

标签: .net wpf api-design dialogresult

任何人都可以想到一个很好的解释,因为对话的结果是WPF中可以为空的bool吗?这一直困扰着我。在WinForms中,它是一个枚举类型,对我来说更有意义。

5 个答案:

答案 0 :(得分:14)

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

当您关闭窗口时,您会注意到对话框的DialogResultfalse,而非对话框的null DialogResult为<{1}}。

答案 1 :(得分:5)

在我看来,这是因为在大多数情况下你不需要像重试或忽略这样的通用专用选项。

如果您需要的不仅仅是OK / Cancel,那么您应该使用某种任务对话框,例如写出答案。这样,你不仅限于几十年前有人想到的几个枚举值,而且DialogResult对基本用途只是正面/负面的,你可以实现自己的属性,特定于你的高级需求。因此,只需要true / false,并且null表示窗口尚未关闭(尚未为该属性分配任何值)。

如果您的对话框不仅仅是用户应该回答的问题(例如报名表格),那么通常情况下您可以选择确定/取消,这样您就不需要更多的值了。

答案 2 :(得分:2)

根据the MSDN documentation

  

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

但是我不确定除非你正在处理多个线程访问对话框,否则会发生这种情况。

当发生以下任何一种情况时,文档说错:

  
      
  • PressesALT + F4。
  •   
  • 单击“关闭”按钮。
  •   
  • 从系统菜单中选择关闭。
  •   

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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