Установка DialogResult только после ShowDialog () в WPF

У меня есть окно, которое я иногда открываю с помощью Show(), а иногда с помощью ShowDialog(). Во втором случае мне важен возвращаемый результат диалога. Но если я установлю DialogResult после вызова Show(), я получу InvalidOperationException. Есть ли способ узнать, какой метод использовался для открытия окна и установить или нет DialogResult соответственно? Или есть другой способ?

Конечно, я знаю, что могу поймать и проигнорировать исключение, но мне это решение не нравится.


person svick    schedule 04.09.2009    source источник


Ответы (4)


Используйте System.Windows.Interop.ComponentDispatcher.IsThreadModal внутри окна, чтобы определить, работает ли он в модальном потоке или нет.

person Pop Catalin    schedule 04.09.2009
comment
Не всегда работает, в нашем случае нам пришлось обернуть DialogResult = x; вызовите try / catch для правильного поведения. - person Doug; 21.10.2013

Если вы посмотрите на set_DialogResult в Reflector, он проверяет _showingAsDialog, чтобы определить, является ли диалог модальным. К сожалению, это частное поле.

Всегда ли вы создаете новый экземпляр окна перед вызовом Show () / ShowDialog (). Если это так, вы можете передать конструктору аргумент, указывающий, как он должен отображаться.

person Phil Devaney    schedule 04.09.2009

Вы можете использовать свойство Form.Modal, чтобы проверить тип использования.

В случае использования Form.Show() вы должны использовать другой способ сообщить вызывающей стороне о любых результатах формы.

Есть ли причина использовать оба способа отображения формы?

person Frank Bollack    schedule 04.09.2009
comment
Это свойство не существует в WPF - person McAden; 05.12.2009

Как насчет того, чтобы просто установить this.DialogResult = DialogResult.blah в событии закрытия формы?

person Stuart Grassie    schedule 04.09.2009
comment
Как это поможет? Это все равно установит его даже после Show () и вызовет исключение. Кстати, я использую WPF (я не указал это четко), поэтому DialogResult - это bool ?. - person svick; 04.09.2009
comment
прежде чем я сделаю это.Close (); в модальном окне я установил this.DialogResult = DialogResult.OK; и в основной форме это именно то, что я получаю. Спасибо, сграсси :) - person balexandre; 18.02.2010