Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Dialogresult является нулевым, когда диалоговое окно показано, но не принимается и не отменено.

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

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

  • Pressesalt+F4.
  • Нажимает кнопку «Закрыть».
  • Выбирает близкие из меню системы.

Showdialog всегда вернет True или Fall. Dialogresult примет нулевое состояние только после открытия диалога. Переход от NULL на True или False закроет диалог и сделает исходный вызов, чтобы Showdialog return.

ИМО это потому, что диаграмма не всегда используется. Видите ли, вы можете установить Dialogresult, только если окно называется методом Showdialog (), если вы позвоните его методом Show (), и попытаться установить Dialogresult на что угодно, оно бросит InvalidoperationException. Поэтому я думаю, что это причина, по которой это является нулевой, если вы позвоните в окно с помощью метода Show (), это будет нулевым, если вы позвоните, используя ShowDialog (), это зависит от вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top