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

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

Ответы на вопрос(5)

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

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

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

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

PressesALT + F4.Нажмите кнопку Закрыть.Выбирает Закрыть в системном меню.
 Samuel Jack12 июн. 2009 г., 17:40
Я думаю, что это происходит, когда пользователь нажимает кнопку Закрыть в правом верхнем углу окна.
 Max Schmeling12 июн. 2009 г., 17:46
не в соответствии с документацией, на которую я ссылаюсь ... я отредактирую более подробно
 Drew Noakes06 нояб. 2009 г., 17:44
@ Макс, если ты позвонишьShow затем вызов возвращается к вам (т. е. это неблокирующий вызов), так что вы можете свободноDialogResult ценность сразу. Это только если вы позвонитеShowDialog что вызов блокируется, пока диалог не будет закрыт. Однако в последнем случае вы все еще можете свободно запрашивать объект из другого потока, как вы указали.

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

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.

 Martin Harris12 июн. 2009 г., 17:45
Хотя это верно и, вероятно, уместно, в перечислении DialogResult уже было значение None, которое вполне соответствовало бы цели null в этом примере. Поэтому я сомневаюсь, что желание иметь нулевое значение было достаточной причиной, чтобы отойти от устоявшейся модели.
 Kent Boogaart12 июн. 2009 г., 17:48
Для меня нуль означает совершенно неуместно, в то время как никто не предполагает, что это актуально, но еще не установлено.пожимает Семантика.
 PeterAllenWebb30 апр. 2010 г., 16:39
«Свойство DialogResult определено в классе Window. Не все окна являются диалоговыми окнами». Эти два предложения кажутся правдивыми и веселыми одновременно.
 Martin Harris12 июн. 2009 г., 17:53
Как ни странно, я бы прочитал это по-другому. Null - это неустановленное значение, и None означает, что DialogResult не существует и никогда не будет. Возможно, такого рода путаница была достаточной причиной, чтобы сменить модель.
Решение Вопроса

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

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

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

 OregonGhost19 нояб. 2009 г., 10:46
BOOL? На мой взгляд, легче справиться, чем yaetr (еще одно перечисление, которое нужно запомнить). И нулевое значение может быть полезно для привязок в качестве неназначенного значения, в отличие от определенных значений true / false. Конечно,Я не знаю почему так, просто гадать :)
 Shimmy18 нояб. 2009 г., 22:50
Тогда почему Nullable (Of Boolean), а не просто Boolean или ThreeState?

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

 Carlo12 июн. 2009 г., 20:45
Хм, этот ответ уже сказал Кент Бугаарт, извините за перепост!

Ваш ответ на вопрос