Почему DialogResult является нулевым bool в WPF?

может ли кто-нибудь придумать хорошее объяснение тому факту, что результатом диалога является nullable bool в WPF? Это всегда сбивало меня с толку. В WinForms это был тип перечисления, и это имело для меня гораздо больше смысла.

5 ответов


на мой взгляд, это было сделано потому, что в большинстве случаев вам не нужен обобщенная специализированных параметры, такие как повторить или игнорировать.

Если вам нужно больше, чем OK / Cancel, вы должны использовать какой-то диалог задачи, например, с письменными ответами. Таким образом, вы не ограничены несколькими значениями перечисления, которые кто-то думал несколько десятилетий назад, и DialogResult просто положительный / отрицательный для базового использования, и вы можете реализовать свое собственное свойство, специфичное для вашего продвинутые потребности. Поэтому требуется только true / false, а null указывает, что окно еще не закрыто (для свойства еще не присвоено значение).

Если у вас есть диалог, который больше, чем просто вопрос, на который пользователь должен ответить (например, форма ввода), вам обычно лучше с OK/Cancel, поэтому вам не нужно больше значений.


на DialogResult свойство определяется на Window класса. Не все!--3-->s являются диалоги. Таким образом свойство не относится ко всем windows. А 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);
        }
    }
}

когда вы закройте окна, вы заметите, что диалоговое окно имеет DialogResult of false, а не в диалоговом окне null DialogResult.


по данным документация MSDN:

DialogResult имеет значение null, когда диалог box отображается, но не принимается и отмененный.

но я не уверен, как это может произойти, если вы не имеете дело с несколькими потоками, обращающимися к диалогу.

в документации говорится, что это ложь, когда происходит одна из следующих вещей:

  • PressesALT+F4.
  • щелкает закрыть кнопка.
  • выбирает закрыть в системном меню.

ShowDialog всегда будет возвращать true или false. DialogResult будет принимать только нулевое состояние, когда диалоговое окно открыто. Переход от null к true или false закроет диалоговое окно и сделает исходный вызов для возврата ShowDialog.


IMO это потому, что DialogResult не всегда используется. Вы видите, вы можете установить DialogResult только если окно вызывается методом ShowDialog (), если вы вызываете его с помощью метода Show() и пытаетесь установить DialogResult на что-либо, это вызовет исключение InvalidOperationException. Поэтому я думаю, что это причина, по которой она nullable, если вы вызываете окно с помощью метода Show (), это будет null, если вы вызываете его с помощью ShowDialog (), это зависит от вас.