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

Form.ShowDialog() или Form.ShowDialog(это)?

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

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

UPDATE:

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

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

4b9b3361

Ответ 1

Просто, чтобы лучше понять отношения владельца:

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

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


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

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

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

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

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

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

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

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

Ответ 2

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

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

В.С.

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

Моя проблема состояла в том, чтобы вызвать ShowDialog() из формы, которая была поднята с ShowDialog(). В результате появилась скрытая форма, к которой нельзя было получить доступ, чтобы закрыть ее.

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

Ответ 8

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

Ответ 9

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

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

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