Подтвердить что ты не робот

Почему DialogResult имеет значение nullable bool в WPF?

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

4b9b3361

Ответ 1

По-моему, это было сделано, потому что в большинстве случаев вам не нужны обобщенные специализированные параметры, такие как Retry или Ignore.

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

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

Ответ 2

Свойство DialogResult определено в классе Window. Не все Window - это диалоги. Поэтому свойство не относится ко всем окнам. A 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 из false, в то время как не-диалог имеет null DialogResult.

Ответ 3

В соответствии с документация MSDN:

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

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

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

  • PressesALT + F4.
  • Нажмите кнопку "Закрыть".
  • Выбирает Close из меню System.

Ответ 4

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

Ответ 5

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