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

Pet*_*ebb 18 .net wpf api-design dialogresult

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

Ken*_*art 15

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>
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当您关闭窗口,你会发现,在对话框中有一个DialogResultfalse,而非对话框有一个null DialogResult.


Ore*_*ost 6

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

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

如果您的对话框不仅仅是用户应该回答的问题(例如输入表单),那么通常情况下,使用"确定/取消"会更好,因此您不需要更多值.