Почему DialogResult является недобросовестным булом в WPF? - PullRequest
17 голосов
/ 12 июня 2009

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

Ответы [ 5 ]

14 голосов
/ 12 июня 2009

Свойство 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);
        }
    }
}

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

5 голосов
/ 12 июня 2009

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

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

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

2 голосов
/ 12 июня 2009

Согласно документации MSDN :

DialogResult равен нулю, когда диалоговое окно поле отображается, но не принято и не отменен.

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

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

  • PressesALT + F4.
  • Нажмите кнопку Закрыть.
  • Выбор Закрыть из системного меню.
0 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

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

...