Showdialog c что это
Showdialog c что это
[Обычные окна, использование Show]
После запуска программы отобразятся сразу две формы, Form1 и Form2.
Чтобы можно было вызывать из Form1 подпрограммы и функции (методы) из Form2 (и наоборот), то необходимо инициализировать и запускать формы немного по-другому (код из Program.cs):
Пример вызова из класса Form2 (процедура Form2_FormClosed) метода класса Form1 (процедуру Close):
[Модальные окна, использование ShowDialog]
Модальное окно должно блокировать другие окна, пока не будет закрыто модальное окно. Обычно модальное окно используется для диалогов настройки, а также для фокусирования внимания пользователя на каком-то событии. В приложении в любое время может быть активно и доступно для пользователя только одно модальное окно. Часто диалог About тоже запускают как модальное окно.
Любую обычную форму можно запустить как модальное окно, если вместо Show() использовать ShowDialog(). Пример запуска диалогового (модального) окна настройки, вызываемого из меню:
[Важные отличия Show от ShowDialog]
2. Если после вызова Show() пользователь закроет вызванное окно, то повторно вызвать Show() не получится, так как объект окна будет уничтожен, и его надо будет создавать заново. Т. е. Использование Show() всегда должно быть по такой схеме: создание экземпляра класса окна (), Show(), закрытие окна. При каждом вызове Show() экземпляр класса окна нужно создавать заново в коде приложения.
3. ShowDialog() работает по другому: после закрытия пользователем окна (в отличие от Show()) экземпляр класса окна не будет уничтожен, поэтому не нужно перед каждым новым вызовом ShowDialog создавать экземпляр класса. Этот экземпляр класса может быть создан только один раз при старте приложения (например, в функции Main модуля Program.cs).
4. Свойства модального окна нужно менять в самом классе этого окна, а не из классов других окон, так как действие кода из другого класса не будет производить никакого эффекта на модальное окно. Например, поменять свойства Top и Left модального окна, влияющие на его положение, из модулей других окон не получится.
Window. Show Dialog Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Открывает окно и возвращается только после его закрытия.
Возвращаемое значение
Значение Nullable типа Boolean, определяющее было действие принято ( true ) или отменено ( false ). Возвращаемое значение представляет собой значение свойства DialogResult перед закрытием окна.
Исключения
Метод ShowDialog() вызывается для окна, которое закрывается (Closing) или закрыто (Closed).
Примеры
В следующем примере показано, как открыть модальное окно.
Комментарии
При Window создании экземпляра класса он не отображается по умолчанию. ShowDialog показывает окно, отключает все остальные окна в приложении и возвращает, только когда окно закрыто. Этот тип окна называется модальным окном.
Модальные окна в основном используются в качестве диалоговых окон. Диалоговое окно — это специальный тип окна, с помощью которого приложения взаимодействуют с пользователями для выполнения задач, таких как открытие файлов или печать документов. Диалоговые окна обычно позволяют пользователям принимать или отменять задачи, для которых они отображались до закрытия диалогового окна. ShowDialogВозвращает Nullable Boolean значение, указывающее, было ли действие принято или отменено. Возвращаемое значение представляет собой значение свойства DialogResult перед закрытием окна. Для получения дополнительной информации см. DialogResult.
Этот метод не может быть вызван, если окно размещается в браузере.
Common Dialog. Show Dialog Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Запускает общее диалоговое окно.
Перегрузки
Запускает общее диалоговое окно с заданным по умолчанию владельцем.
Запускает общее диалоговое окно с указанным владельцем.
ShowDialog()
Запускает общее диалоговое окно с заданным по умолчанию владельцем.
Возвращаемое значение
Объект OK, если пользователь нажимает кнопку ОК в диалоговом окне; в противном случае — объект Cancel.
Примеры
В следующем примере кода используется ColorDialog реализация CommonDialog и демонстрируется создание и отображение диалогового окна. В этом примере требуется, чтобы метод вызывался из существующей формы, которая имеет TextBox и Button поместила в нее.
Комментарии
Этот метод реализует RunDialog.
См. также раздел
Применяется к
ShowDialog(IWin32Window)
Запускает общее диалоговое окно с указанным владельцем.
Параметры
Любой объект, который реализует IWin32Window, представляющий окно верхнего уровня, которое станет владельцем модального диалогового окна.
Возвращаемое значение
Значение OK, если пользователь нажимает кнопку ОК в диалоговом окне; в противном случае значение Cancel.
Комментарии
Эта версия ShowDialog метода позволяет указать конкретную форму или элемент управления, который будет владеть отображаемым диалоговым окном. Если вы используете версию этого метода без параметров, отображаемое диалоговое окно будет автоматически владельцем текущего активного окна приложения.
Form. Show Dialog Method
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Shows the form as a modal dialog box.
Overloads
Shows the form as a modal dialog box.
Shows the form as a modal dialog box with the specified owner.
ShowDialog()
Shows the form as a modal dialog box.
Returns
One of the DialogResult values.
Exceptions
The form being shown is already visible.
The form being shown is disabled.
The form being shown is not a top-level window.
The form being shown as a dialog box is already a modal form.
The current process is not running in user interactive mode (for more information, see UserInteractive).
Examples
Remarks
You can use this method to display a modal dialog box in your application. When this method is called, the code following it is not executed until after the dialog box is closed. The dialog box can be assigned one of the values of the DialogResult enumeration by assigning it to the DialogResult property of a Button on the form or by setting the DialogResult property of the form in code. This value is then returned by this method. You can use this return value to determine how to process the actions that occurred in the dialog box. For example, if the dialog box was closed and returned the DialogResult.Cancel value through this method, you could prevent code following the call to ShowDialog from executing.
This version of the ShowDialog method does not specify a form or control as its owner. When this version is called, the currently active window is made the owner of the dialog box. If you want to specify a specific owner, use the other version of this method.
Можно ли использовать ShowDialog без блокировки всех форм?
надеюсь, я смогу объяснить это достаточно ясно. У меня есть моя основная форма (A), и она открывает 1 дочернюю форму (B) с помощью формы.Show () и вторая дочерняя форма (C) с использованием формы.Шоу.)( Теперь я хочу, чтобы дочерняя форма B открыла форму (D) с помощью формы.Метода showdialog(). Когда я это делаю, он блокирует форму A и форму C. Есть ли способ открыть модальный диалог и только заблокировать форму, которая его открыла?
10 ответов
Если вы запустите форму B в отдельном потоке из A и C, вызов ShowDialog заблокирует только этот поток. Понятно, что это не тривиальная инвестиция в работу, конечно.
вы можете иметь диалог не блокировать любые потоки вообще, просто запустив вызов ShowDialog формы D в отдельном потоке. Это требует такой же работы, но гораздо меньше, так как у вас будет только одна форма, работающая с основным потоком вашего приложения.
использование нескольких потоков GUI-сложный бизнес, и я бы не советовал, если это ваша единственная мотивация для этого.
гораздо более подходящим подходом является использование Show() вместо ShowDialog() и отключите форму владельца, пока не вернется всплывающая форма. Есть только четыре соображения:
когда форма отображается в виде диалога, установите ее DialogResult собственность автоматически закрывает его. Это свойство устанавливается всякий раз, когда кнопка с DialogResult собственность, кроме это. Форма, показанная с Show не будет автоматически закрываться, поэтому мы должны явно закрыть его при нажатии одной из кнопок увольнения. Обратите внимание, однако, что DialogResult свойство по-прежнему устанавливается соответствующим образом кнопкой.
реализуя эти четыре вещи, ваш код становится чем-то вроде:
я хотел бы обобщить возможные решения и добавить одну новую альтернативу (3a и 3b). Но сначала я хочу уточнить, о чем мы говорим:
у нас есть приложение, которое имеет несколько форм. Существует требование показать модальный диалог, который будет блокировать только определенное подмножество наших форм, но не другие. Модальные диалоги могут отображаться только в одном подмножестве (сценарий A) или нескольких подмножествах (сценарий B).
и теперь резюме можно решения:
не используйте модальные формы, показанные через ShowDialog() на всех
подумайте о дизайне вашего приложения. Вам действительно нужно использовать ShowDialog() способ? Если вам не нужна модальная форма, это самый простой и чистый способ пойти.
конечно, это решение не всегда подходит. Есть некоторые особенности, которые ShowDialog() дает нам. Самое примечательное, что он отключает владельца (но не серые) и пользователя не может взаимодействовать с ним. Очень утомительный ответ предоставил P Папа.
повторить ShowDialog() поведение
можно эмулировать поведение этого mathod. Еще раз рекомендую прочитать P Папин ответ.
эти два решения требуют, чтобы у вас был полный контроль над всеми диалоговыми окнами, которые вам нужно обработать. Вы должны использовать специальную конструкцию для отображения «частично блокирующего диалога» и должны не забывайте об этом. Вам нужно настроить свою логику, потому что Show() не блокирует и ShowDialog() блокирует. Работа с системными диалогами (выбор файлов, выбор цветов и т. д.) может быть проблема. С другой стороны, вам не нужен дополнительный код на формах, которые не должны быть заблокированы диалогом.
преодолеть ограничения ShowDialog()
обратите внимание, что есть Application.EnterThreadModal и Application.LeaveThreadModal событий. Этот событие возникает всякий раз, когда отображается модальный диалог. Помните, что события на самом деле являются потоковыми, а не прикладными.
a) прослушайте Application.EnterThreadModal событие в формах, которые не должны быть заблокированы диалог и поворот на WS_DISABLED немного в этих формах. Вам нужно только настроить формы, которые не должны быть заблокированы модальными диалогами. Вам также может потребоваться проверить родительскую цепочку показываемой модальной формы и переключиться WS_DISABLED на основе этого условия (в вашем пример, если вам также нужно открыть диалоги по формам A и C, но не блокировать формы B и D).
b) скрыть и повторно показать формы, которые не должны быть заблокированы. Обратите внимание, что при отображении новой формы после отображения модального диалога она не блокируется. Воспользуйтесь этим, и когда модальный диалог отображается, скрыть и показать снова нужные формы, чтобы они не были заблокированы. Однако такой подход может вызвать некоторое мерцание. Теоретически это можно исправить, включив / отключив перекраску формы в win API, но я не гарантирую, что.
c) Set Owner свойство диалоговой формы на формах, которые не должны быть заблокированы при отображении диалога. Я не проверял это.
d) используйте несколько потоков GUI. ответ от TheSmurf.
Я просто хотел добавить свое решение здесь, поскольку оно, похоже, хорошо работает для меня и может быть инкапсулировано в простой метод расширения. Единственное, что мне нужно сделать, это разобраться с миганием, поскольку @nightcoder прокомментировал ответ @PDaddy.
запустить FormB в новом потоке в FormA:
теперь любые формы, открытые в новом потоке с помощью ShowDialog (), будут блокировать только FormB, а не FormA или FormC
используя идеи, высказанные здесь, и в других местах, мне удалось преодолеть эту ошибку.
Я объявил поток внутри моего основного пользовательского интерфейса.
следующий код имеет дело с событием, запущенным, чтобы открыть диалоговое окно справки.
мне также нужна была инициализация потока, добавленного в мой конструктор, чтобы убедиться, что я не ссылаюсь на нулевой объект при первом запуске этого кода.
это гарантирует что поток имеет только один экземпляр в любой момент времени. Поток сам запускает диалог и останавливается после закрытия диалога. Поскольку он работает в отдельном потоке, создание модального диалога из основного пользовательского интерфейса не вызывает зависания диалога справки. Мне нужно было добавить
к событию закрытия формы моего основного пользовательского интерфейса, чтобы убедиться, что диалоговое окно справки закрывается при завершении приложения.
теперь у меня есть диалог modeless help, который не зависит от каких-либо модальные диалоги возникли из моего основного пользовательского интерфейса, что именно то, что я хотел. Это безопасно, так как нет никакой связи между основным пользовательским интерфейсом и диалогом справки.