Может ли кто-нибудь подумать о хорошем объяснении того факта, что результатом диалога является обнуляемый bool в WPF? Это меня всегда сбивало с толку. В WinForms это был тип перечисления, и это сделало для меня намного больше смысла.
Почему DialogResult имеет значение nullable bool в WPF?
Ответ 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(), это зависит от вас.