Подтвердить что ты не робот

Когда ShowDialog() возвращает null?

WPF Window.ShowDialog метод возвращает значение nullable boolean. Так что CommonDialog.ShowDialog.

Теперь я понимаю случаи, когда они вернут false (пользователь нажал "Отмена" или нажал Esc), и когда они вернут true (код устанавливает Window.DialogResult в true, возможно, в ответ на нажатие OK). Но null?

Моя первая мысль заключается в том, что нажатие клавиши заголовка Close может вернуть значение null. Но состояние документов (и я подтвердил при тестировании), что кнопка закрытия строки заголовка рассматривается как Отмена.

Итак, когда Window.ShowDialog или CommonDialog.ShowDialog когда-либо возвращают null?

4b9b3361

Ответ 1

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

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

Ответ 2

Если я возвращаю 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"/>

Ответ 3

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

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

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