Кто-нибудь видел в WinForms, что вызов одного модального диалога из другого модального диалога приводит к отмене модальности?

Вопросы:

Кто-нибудь видел, что вызов одного модального диалога из другого модального диалога приводит к отмене модальности?

Если вы хотите сделать вызов с ShowDialog, чтобы получить результат, но без его модальности (другие формы по-прежнему отвечают), как бы вы это сделали? (Мы не пытаемся сделать это... но если есть способ сделать это, возможно, мы делаем это случайно.)

Детали:

Мы реализовали наш собственный диалог печати, который имеет кнопки, которые вызывают стандартный PrintDialog, стандартный PageSetupDialog и стандартный PrintPreviewDialog. А печать выполняется с помощью нашего собственного класса PrintDocument, полученного из стандартного класса PrintDocument. Итак, мы пытаемся следовать стандартным методам... у нас просто есть несколько дополнительных настроек, с которыми нам нужно, чтобы пользователь начал.

Мы вызываем наш диалог печати из меню, используя ourPrintDialog.ShowDialog (mainWindow). Когда это происходит, это правильно модально (все другие окна не реагируют... в частности, это основное окно). В этом диалоговом окне "Печать" есть кнопки для вызова каждого из трех других диалогов... и все они запускаются с помощью ShowDialog(ourPrintDialog), в результате чего первый диалог "Печать" становится его родителем. В случае PrintDialog и PageSetupDialog они появляются модально (mainWindow и ourPrintDialog, а все остальные окна не реагируют). И когда мы OK или Отмена тех, он возвращается к первому диалоговому окну печати (ourPrintDialog), который все еще является модальным (другие окна не отвечают).

Однако в случае стандартного PrintPreviewDialog, хотя мы вызываем его таким же образом (ShowDialog с первым диалогом в качестве его родителя), он получается не совсем модальным. Наше главное окно снова становится отзывчивым. Итак, вы можете начать манипулировать базовым документом, который находится в процессе печати в диалоговом окне "Печать", что, конечно, противоречит многим предположениям. И когда вы закрываете диалоговое окно "Просмотр", возвращаясь к исходному диалоговому окну "Печать", оно также теперь не находится в модальном состоянии... главное окно все еще отвечает.

Мы попытались сделать это в простом тестовом приложении, и оно отлично работает... модальность не нарушается при входе в PrintPreviewDialog. Итак, похоже, что существует какое-то конкретное взаимодействие между PrintPreviewDialog (поскольку это не происходит с двумя другими) и главным окном нашего приложения (так как это не происходит с тестовым приложением). Любые предложения о том, что это может быть? (И, следовательно, мои два вопроса выше.)

Спасибо заранее за любые предложения!

1 ответ

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

Другие вопросы по тегам