Когда ShowDialog () вернет ноль? - PullRequest
31 голосов
/ 13 июня 2009

Метод Window.ShowDialog WPF возвращает логическое значение NULL. Так же, как и CommonDialog.ShowDialog.

Теперь я понимаю случаи, когда они возвращали бы ложь (пользователь нажал Отмена или нажал Esc), и когда они возвращали бы истину (код устанавливает Window.DialogResult в истину, вероятно, в ответ на нажатие кнопки ОК). Но ноль?

Сначала я подумал, что нажатие кнопки «Закрыть» в строке заголовка может вернуть ноль. Но документы заявляют (и я подтвердил тестирование), что кнопка закрытия строки заголовка обрабатывается как Отмена .

Так когда же Window.ShowDialog или CommonDialog.ShowDialog когда-нибудь вернет ноль?

Ответы [ 3 ]

23 голосов
/ 13 июня 2009

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

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

2 голосов
/ 18 марта 2010

Если я верну DialogResult = null в событии Click для кнопки, окно останется открытым.

private void OkButton_Click(object sender, RoutedEventArgs e)
{
   Button btn = sender as Button;
   if ( btn != null )
   {
       // forces all control to update...
       btn.Focus();
   }

   // TEST IF OK TO CLOSE
   bool rc = _vm.ProcessOkCommand();
   if (rc)
   {
      DialogResult = true;
   }
   else
   {
      DialogResult = null;
   }
}


<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/>
0 голосов
/ 09 апреля 2019

Я могу привести пример, с которым я только что столкнулся. Window.ShowDialog() вернет ноль, если вы выполните следующие шаги:

  • Сначала закройте все окна Application.
  • Все остальные Window объекты, которые были созданы до сих пор с ключевым словом new, закрыты.
  • Вы пытаетесь создать экземпляр Window и попытаться вызвать Window.ShowDialog(). Он вернет ноль.

Это потому, что, по-видимому, у вас нет существующего Window, с которым ваш новый диалог может связываться, чтобы вести себя как диалог, которому принадлежит самое верхнее состояние окна.

...