Form.ShowDialog () или Form.ShowDialog (это)? - PullRequest
34 голосов
/ 03 мая 2009

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

Не могли бы вы объяснить, в какой ситуации я мог получить описанную проблему?

UPDATE:

Что ж, я провел много экспериментов и не смог получить никаких неожиданных проблем с использованием ShowDialog () (без указания владельца).

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

Ответы [ 8 ]

20 голосов
/ 12 января 2010

Одно раздражение, которое я нашел с ShowDialog() против ShowDialog(this).

Запустите TestApp, отобразите newform.ShowDialog(), нажмите «Показать рабочий стол» на панели задач или панели быстрого запуска, нажмите TestApp на панели задач. Это показывает Mainform. Вы должны сделать Alt-Tab, чтобы добраться до новой формы.

VS

Запустите TestApp, отобразите newform.ShowDialog(this), нажмите «Показать рабочий стол» на панели задач или панели быстрого запуска, нажмите TestApp на панели задач. Он показывает новую форму сверху.

8 голосов
/ 03 мая 2009

«Текущее активное окно» обычно относится к окну переднего плана, но только если оно принадлежит текущему потоку - см. GetActiveWindow в MSDN.

(Фактическая информация содержится в контенте сообщества, но комментатор прав, что нет "активного окна для потока", AFAIK).

Таким образом, когда пользователь переключается на другое окно приложений (или потоков), вы получаете какое-то «окно по умолчанию». Даже если .NET примет здесь какое-то волшебство, модальность будет нарушена: предполагаемое родительское окно не будет отключено (например, вы можете переключиться на главное окно и закрыть его или изменить что-то, что часто нарушает ваше приложение из-за повторного входа) ,

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

Как незначительное раздражение, начальная позиция обычно неверна или вводит в заблуждение.

На практике это случается редко, хотя: если вы откроете диалоговое окно в ответ на нажатие меню или кнопки в главном окне, пользователю практически никогда не удастся переключиться на другое окно.

Однако это технически возможно, и вполне вероятно, что это произойдет, если вы откроете диалоговое окно в ответ на некоторую автоматизацию, внешнее сообщение и т. Д.

7 голосов
/ 30 июня 2013

Просто для лучшего понимания отношений с владельцем:

.NET позволяет форме «владеть» другими формами. Собственные формы полезны для плавающий инструментарий и командные окна. Одним из примеров владения формой является окно «Найти и заменить» в Microsoft Word. Когда окно владельца свернутые формы также автоматически свернуты. Когда принадлежащая форма перекрывает своего владельца, она всегда отображается сверху.

(c) "Pro .NET 2.0 Windows Forms и пользовательские элементы управления" Мэтью Макдональда.


Поскольку ShowDialog показывает новую форму, неявное отношение установлено между активной в данный момент формой, известной как владелец форма и новая форма, известная как форма собственности. Это отношения гарантирует, что форма собственности является активной и всегда отображается на вершина формы владельца.

Одной из особенностей этих отношений является то, что форма собственности влияет на поведение формы его владельца (при использовании ShowDialog ):

  • Форма владельца не может быть свернута, развернута или даже перемещена.
  • Собственная форма блокирует ввод мыши и клавиатуры в форму владельца.
  • Форма владельца свернута, если она принадлежит.
  • Только закрытая форма может быть закрыта.
  • Если формы владельца и владельца свернуты, и если пользователь нажимает Alt + Tab, чтобы переключиться на собственную форму, активная форма активируется.

Однако, в отличие от метода ShowDialog, вызов метода Show делает не устанавливать скрытые отношения собственника . Это означает, что любая форма может быть текущей активной формой.

Без неявных отношений с владельцем, владельцем и формами собственности одинаково может быть свернуто, развернуто или перемещено. Если пользователь закрывает любой форма, отличная от основной формы, последняя активная форма возобновлена.

Хотя ShowDialog устанавливает неявные отношения владельца с владельцем , нет встроенного способа, которым принадлежащая форма могла бы перезвонить или запросить форма, которая открыла его. В немодальном случае вы можете установить новый Форма собственности владельца для установления отношений с владельцем. Как ярлык, вы можете передать форму владельца в качестве аргумента для перегрузки метода Show, который также принимает параметр IWin32Window (IWin32Window реализуется объектами пользовательского интерфейса Windows Forms, которые Свойство Win32 HWND через свойство IWin32Window.Handle).

Поведение форм в явной модальной собственности владельца отношение такое же, как его неявный модальный аналог, но немодальные отношения собственника обеспечивают дополнительное поведение в не принадлежащий владельцу немодальный кейс. Во-первых, немодальная форма собственности всегда появляется в верхней части формы владельца, хотя любой из них может быть активным. Это полезно, когда вам нужно сохранить форму, например плавающий инструмент окно, поверх других форм в приложении. Во-вторых, если пользователь нажимает Alt + Tab, чтобы перейти от владельца, принадлежащие формы следуют подходить. Чтобы убедиться, что пользователь знает, какая форма является основной, сворачивание владельца скрывает кнопки панели задач для всех принадлежащих форм, оставляя видимой только кнопку панели задач владельца.

(c) «Программирование Windows Forms 2.0» Криса Селлса, Майкла Вайнхардта.

5 голосов
/ 03 мая 2009

В параметре ShowDialog () просто используется родитель по умолчанию. Для чего стоит родитель по умолчанию - это то, чем является «текущее активное окно». Когда вас волнует, кто является родителем, вам нужно установить его явно.

1 голос
/ 12 мая 2012

Возьмите следующий пример:

В основной форме у вас есть ListView с включенным редактированием меток. Когда определенная метка редактируется, вы запускаете второе окно (используя ShowDialog() в AfterLabelEdit). Новая форма не отображается на панели задач.

Если ваш пользователь начинает редактировать метку, затем нажимает на другое приложение, тогда отображается вторая форма, но при возврате в ваше приложение пользователю будет представлена ​​только ваша основная форма, отключенная, так как отображается модальное диалоговое окно. Тем не менее, обычный мигающий механизм (который переводит модальное диалоговое окно в шрифт, если вы щелкаете вызывающего абонента) не будет работать (конечно, потому что вызов AfterEdit еще не вернулся), и ваш пользователь не сможет получить вторую форму, кроме как циклическим через открытые окна, используя Ctrl + Tab.

Вызов ShowDialog(this) исправляет эту проблему.

1 голос
/ 17 января 2012

Да, в некоторых случаях это имеет значение. До сих пор у меня не было проблем с методом без параметров, и я немного удивился, что родительская форма не была формой по умолчанию. Поэтому, чтобы избежать непредвиденного поведения, всегда передавайте реальную родительскую форму методу ShowDialog.

0 голосов
/ 28 апреля 2015

Я только что обнаружил случай, когда отсутствие указания владельца с помощью this вызвало серьезную проблему.

После запуска мое приложение заставляет себя работать в полноэкранном режиме, а также следит за тем, чтобы оно всегда было в фокусе, даже если пользователь пытается нажать Alt + Tab, если вы не вошли в систему как администратор или разработчик.

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

0 голосов
/ 23 июня 2013

У меня была эта проблема, и для ее решения измените свойство состояния windows на обычное, потому что, возможно, оно свернуто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...