Формы приложения могут быть модальными и немодальными


приложения winforms программирование — модальные и немодальные проблема форм

У меня проблема с модальностью форм под C#.NET. Допустим, у меня есть главная форма #0 (см. рисунок ниже). Эта форма представляет собой основную форму приложения, в котором пользователь может выполнять различные операции. Однако, время от времени возникает необходимость открыть дополнительные немодальные формы, чтобы выполнить дополнительные основной функционал приложения вспомогательные задачи. Скажем, это форма № 1 на рисунке. На этом #1 форма могут быть открыты несколько дополнительных модальных форм на верхней части друг с другом (#2 форма в изображении), и в конце концов, есть диалоговое окно хода выполнения, показывающий длительной эксплуатации прогресс и статус, который может занять от нескольких минут до нескольких часов. Проблема в том, что основная форма #0 не реагирует, пока вы не закроете все модальные формы (#2 на изображении). Мне нужно, что основная форма #0 будет действовать в этой ситуации. Однако, если открыть немодальные формы, в форме № 2, Вы можете работать как с модальным #2 форма и создаваемых не модальную форму. Мне нужно такое же поведение между основной вид #0 и форма № 1 со всеми его дочерних форм. Возможно ли это? Или я делаю что-то неправильно? Может быть, есть какой-нибудь обходной путь, мне очень бы не хотелось менять все вызовы метода showdialog, чтобы показать.

Ответ 1

Модальные формы делать именно то, что «модальное» означает, они отключить все другие окна в приложении. Это очень важно, ваша программа является в некоторой степени опасное состояние. У вас есть кусок кода, который ждет диалогового окна, чтобы закрыть. Действительно плохих вещей может случиться, если эти другие не были отключены. Как пользователь может снова запустить модальное диалоговое окно, Теперь ваш код дважды вложенными. Или она могла закрыть окно владелец диалогового окна, теперь она внезапно исчезает.

Это точно вид проблемы, вы столкнетесь с если вы называете приложения.Функция doevents() внутри цикла. И это один из способов получить бланк вести себя модал без отключения других окон. Например:

Это, конечно, лучше использовать модальные формы, как они были разработаны, чтобы держаться подальше от неприятностей. Если вы не хотите, чтобы модальная форма, то просто не делаю его модальным, используйте метод Show (). Подписаться на его событие FormClosing, чтобы знать, что он вот-вот закроется:

Ответ 2

Первое, что приходит на ум, будет что-то подобное. Вы можете отключить форма 1 при запуске формы 2, а затем уже форма 1 Ручка закрытом мероприятии во второй форме, чтобы снова включить себя. Вы бы не открыть модальное 2 через окно.

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

Ответ 3

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

Ответ 4

Мне кажется, вы могли бы использовать MDI-приложения Настройки форме #0 свойство в true.

Затем, вы могли бы сделать что-то подобное:

С помощью как вы заявили в своем вопросе сделает все формы .

По определению, модальная форма:

When a form is displayed modally, no input (keyboard or mouse click) can occur except to objects on the modal form. The program must hide or close a modal form (usually in response to some user action) before input to another form can occur. Forms that are displayed modally are typically used as dialog boxes in an application.

You can use this property [(Modal)] to determine whether a form that you have obtained from a method or property has been displayed modally.


Так, модальная форма должна быть использована только тогда, когда вы требуете немедленной помощи/взаимодействия с пользователем. Используя модальные формы иначе заставляет поверить, что ты, возможно, работает в неправильном направлении.

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

  • What is it you want to do, apart of making your main form responsive, etc.
  • What is it you have to do?

    Объяснить, что вам нужно сделать, мы могли бы направлять вас в порядке, или, по крайней мере может быть лучше, направление.

    Формы приложения могут быть модальными и немодальными

    Модальные формы отличаются от других форм тем, что при выводе ее на экран, доступ к родительской форме, а так же к ранее созданным объектам приложения запрещается до момента закрытия модальной формы. Свойство блокировки родительской формы очень удобно использовать для формирования различных диалогов, а так же справочников, корректировка которых должна исключать изменение зависимых данных. Но в базовой реализации данного типа форм в Delphi есть один существенный недостаток. При сворачивании (иконофикации) модальной формы, ранее созданные элементы приложения не сворачиваются.

    Одним из вариантов решения этой проблемы может быть использование перехвата системных сообщений WM_ACTIVATEAPP, WM_SYSCOMMAND и вызова Win API функции ShowWindow для изменения состояния главной формы приложения.

    Отличительной особенностью объектного программирования является возможность наследования классов. В неявном виде этот механизм повсеместно используется программистами при создании новых форм или при использовании визуальных компонент. Интересно отметить, что многие программисты, даже с солидным стажем мало уделяют внимания возможности повторного использования единожды написанного кода путем наследования ранее созданных типовых объектов. Я не рассматриваю при этом визуальные компоненты. Здесь имеется в виду собственные наработки программиста. Попробуем создать заготовку для наших модальных форм, реализующую решение ранее описанной проблемы управления сворачиванием и разворачиванием главной формы приложения из модальной формы. Создадим новую форму типа TfrmModal наследующую класс Tform. Текст модуля данной формы приведен ниже:

    Созданную заготовку желательно сохранить в отдельный каталог, доступный всем Вашим проектам. Для этого желательно создать каталог $(DELPHI)\Projects\common.

    Для тестирования созданной заготовки создадим новый проект, например $(DELPHI)\Projects\TestModalForm\ TestModal.dpr. Вызвав меню «Project-Add to project» добавим в проект ранее созданную форму $(DELPHI)\Projects\common\frmuModal. При этом данную форму нужно удалить из списка автоматически создаваемых форм в меню «Project-Options» закладка «Forms».

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

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

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

    Таблица 1. Значения результатов TModalResult

    Константа Значение Описание
    mrNone Используется как значение по умолчанию
    mrOk idOK Выход по нажатию кнопки типа OK
    mrCancel idCancel Выход по нажатию кнопки типа CANCEL
    mrAbort idAbort Выход по нажатию кнопки типа ABORT
    mrRetry idRetry Выход по нажатию кнопки типа RETRY
    mrIgnore idIgnore Выход по нажатию кнопки типа IGNORE
    mrYes idYes Выход по нажатию кнопки типа YES
    mrNo oidN Выход по нажатию кнопки типа NO
    mrAll mrNo + 1 Используется для определения последней предустановленной константы


    Теперь настало время воспользоваться ранее созданной заготовкой. Добавим в проект новую форму, наследующую ранее созданный класс модальной формы. Для этого выберем пункт меню File – New. В появившемся диалоге выберем закладку с именем проекта, и выберем в списке форм проекта форму frmModal. Данную форму так же уберем из списка автоматически создаваемых форм. Добавим метод создания новой формы:

    В главную форму приложения добавим ссылку на модуль новой модальной формы и кнопку вызова ранее созданного метода ShowNewModalForm. Компилируем созданный проект и запускаем его на выполнение. По нажатию на кнопку вызывается наша модальная форма. Причем по нажатию на кнопке «свернуть» сворачивается не только модальная форма, но и главная форма приложения.

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

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

    Модальные и немодальные коды

    Все станочные коды можно условно разделить на два класса в зависимости от их способности сохраняться в памяти СЧПУ. Немодальные коды действуют только в том кадре, в котором они находятся. Модальные коды, напротив, могут действовать бесконечно долго, пока их не отменят другим кодом.

    Выделяют несколько групп кодов в зависимости от функции, которую они выполняют (табл. 5.2). Два модальных кода из одной группы не могут быть активными в одно и то же время. Например, G02 и G03 находятся в группе кодов осевых перемещений, и вы не можете применять оба этих кода сразу. Один из этих кодов обязательно отменит действие другого. Это как попытаться ехать на автомобиле одновременно и вправо, и влево. Однако вы можете одновременно использовать коды из разных функциональных групп. Например, в одном кадре можно написать G02 и G90.

    Таблица 5.2. Коды по группам


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

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

    Мне кажется, что вы можете использовать приложение MDI, чтобы установить свойство формы # 0 IsMdiContainer в значение true.

    Затем вы можете сделать что-то похожее:

    Используя ShowDialog(), как вы заявили в своем вопросе, сделаете все формы Modal = true.

    По определению модальная форма:

    Когда форма отображается модально, вход (клавиатура или мышь) не может выполняться, кроме объектов в модальной форме. Программа должна скрыть или закрыть модальную форму (обычно в ответ на какое-либо действие пользователя), прежде чем может произойти вход в другую форму. Формы, отображаемые модально, обычно используются в качестве диалоговых окон в приложении.

    Вы можете использовать это свойство [(Modal)], чтобы определить, имеет ли форма, полученная вами от метода или свойства, отображается в формате.

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

    Если вы не хотите, чтобы ваша основная форма являлась контейнером MDI, то, возможно, использование многопоточности — это одно из решений с помощью простого BackgroundWorker класс является ключом к тому, чего вы хотите достичь. Таким образом, он выглядит как дизайнерский запах.

    • Что вы хотите сделать, помимо того, что ваша основная форма реагирует и т.д.
    • Что вам нужно делать?

    Объясняя, что вам нужно делать, мы могли бы вести вас в правильном направлении или, по крайней мере, в лучшем направлении.

    Модальные и немодальные диалоговые окна Modal and Modeless Dialog Boxes

    Класс CDialog можно использовать для управления двумя видами диалоговых окон: You can use class CDialog to manage two kinds of dialog boxes:

    Модальные диалоговые окна, требующие ответа пользователя перед продолжением программы Modal dialog boxes, which require the user to respond before continuing the program

    Немодальные диалоговые окна, которые остаются на экране и доступны для использования в любое время, но допускают другие действия пользователя Modeless dialog boxes, which stay on the screen and are available for use at any time but permit other user activities

    Редактирование ресурсов и процедуры для создания шаблона диалогового окна одинаковы для модальных и немодальных диалоговых окон. The resource editing and procedures for creating a dialog template are the same for modal and modeless dialog boxes.


    Чтобы создать диалоговое окно для программы, необходимо выполнить следующие действия. Creating a dialog box for your program requires the following steps:

    Используйте Редактор диалоговых окон для разработки диалогового окна и создания его ресурса диалогового шаблона. Use the dialog editor to design the dialog box and create its dialog-template resource.

    Создайте класс диалогового окна. Create a dialog class.

    Добавление элементов данных, связанных с элементами управления диалогового окна, и задание обмена данными диалога и проверки данных диалоговых окон для элементов управления. Add data members associated with the dialog box’s controls and to specify dialog data exchange and dialog data validations for the controls.

    Модальные и немодальные формы

    Первичным является понятие модального и немодального окна. Окно называется модальным, если нельзя закончить работу в открытом окне до тех пор, пока оно не будет закрыто. Модальное окно не позволяет, если оно открыто, временно переключиться на работу с другим окном. Выйти из модального окна можно, только закрыв его. Немодальные окна допускают параллельную работу в окнах. Форма называется модальной или немодальной в зависимости от того, каково ее окно. Метод Show открывает форму как немодальную, а метод ShowDialog — как модальную. Название метода отражает основное назначение модальных форм — они предназначены для организации диалога с пользователем, и пока диалог не завершится, покидать форму не разрешается.

    1. Написать программу для решения уравнения ах+в=0

    · При а=0 и b<>0 уравнение не имеет решения.

    · При а=0 и b=0 уравнение имеет бесконечное множество решений.

    · При а<>0 уравнение имеет единственное решение х=- b/а.

    Модальные и немодальные формы. Отличия и пример создания

    Модальные окна — это окна, которые в открытом состоянии блокируют работу с другими окнами. Переключиться на работу с другим окном можно только после закрытия модального окна. Форма со свойством перечисления FormBorderStyle, для которого установлено значение FixedDialog, относится к числу диалоговых окон.

    Основное назначение модальных окон — поддержание диалога с пользователем. До завершения диалога модальную форму покинуть нельзя. Часто использование этого типа окон определяется необходимостью подтверждения каких-либо действий путем нажатия определенной кнопки. Широко используются кнопки с надписями «ОК», «Cancel», «Yes», «N0». Для открытия модальных окон используется метод ShowDialog.

    Немодальные (обычные) окна равноправны со всеми другими окнами приложения. Они дают возможность параллельной работы в разных окнах. Для открытия немодальных окон используется метод Show(). Если переменная f ссылается на объект класса, производного от класса Form, то вызов метода f.Show() позволяет переключиться на этот объект. Метод же ShowDialog позволяет сделать это переключение только после закрытия модальной формы.

    Другим отличием методов Show и ShowDialog является то, что метод Show при завершении не возвращает никакого значения, а метод ShowDialog возвращает одно из значений перечисления DialogResult, являющееся идентификатором, поясняющим причину закрытия диалога.

    Следует заметить, что идентификаторы создаются автоматически дизайнером форм при добавлении в форму элементов управления и компонентов.

    Перечисления могут содержать следующие причины закрытия диалога:


    • 1) ОК — работа с формой завершилась успешно (пользователь выполнил требуемую задачу);
    • 2) Cancel — работа с формой завершилась не успешно (пользователь не выполнил требуемую задачу);
    • 3) Abort — прервать;
    • 4) Retry — повторить;
    • 5) Ignore — пропустить;
    • 6) Yes — пользователь ответил утвердительно на заданный вопрос;
    • 7) No — пользователь ответил отрицательно на заданный вопрос.

    При закрытии обычного окна объект окна уничтожается, и по этой причине повторно его вызвать с помощью метода ShowQ нельзя. При закрытии модального окна, созданного с использованием метода ShowDialog, экземпляр класса окна не уничтожается и поэтому не нужно перед каждым новым вызовом создавать экземпляр класса. Он может быть создан всего лишь раз, например, в методе Main() модуля Program.cs.

    Еще одно отличие модального окна от обычного состоит в том, что свойства модального окна можно менять только в самом классе этого окна, в то время как свойства обычных окон можно менять из классов других окон.

    Нужно иметь в виду, что любую обычную форму можно запустить как модальное окно, если вместо метода Show() использовать метод ShowDialog().

    Пример создания и отображения обычного окна на основе класса Form2, производного от класса Form:

    Form2 f2 = new Form2();

    Пример создания и отображения модального окна на основе класса Form2, производного от класса Form:

    Использование модальных окон в пользовательских интерфейсах

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

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

    Начнем это исследование со следующего смелого утверждения:

    Существует два типа экранов:

    1. Модальные экраны
    2. Немодальные экраны

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

    Что такое «модальный экран»?

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


    • Полноэкранные модальные виды
    • Всплывающие окна
    • Поп-апы
    • Лайтбоксы

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

    «Модальное окно создает режим, который отключает главное окно, но сохраняет его видимым с модальным окном в виде дочернего окна перед ним. Пользователи должны повзаимодействовать с модальным окном, прежде чем они смогут вернуться в родительское приложение» — Википедия

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

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

    Пример iOS: модальные окна на мобильных устройствах часто полностью скрывают главное окно приложения.

    Основное различие заключается в способе взаимодействия с каждым из окон. В то время как немодальный экран позволяет пользователям вернуться к родительскому экрану, модальный экран требует, чтобы пользователи завершили определённое действие, прежде чем вернуться в главное окно (такое как нажатие кнопки «Сохранить» в нашем примере) или отменить текущее действие, вызвавшее модальное окно.

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

    Модальный же экран требует, чтобы пользователи закрывали окно, прежде чем они снова смогут использовать основную навигацию приложения (Кнопки «Сохранить» или «Отмена» в нашем примере).

    Почему следует использовать модальность?

    «Модальность создает фокусировку, не давая людям заниматься другими делами, прежде чем они не завершат задачу или не отклонят вызванное в модальном окне представление» — Apple

    Когда следует использовать модальность?

    Теперь, когда мы знаем, как выглядит модальный экран. Как же сравнить его с немодальным экраном и какова его цель? Прежде всего мы должны спросить себя: «В какой ситуации мы должны его использовать?»

    Давайте представим, что мы создаем «гениальный и инновационный» стартап под названием «Purrrfect». Это база данных котят, которая позволяет пользователям загружать, просматривать и комментировать GIF-изображения милых котяток.

    Упрощенный пользовательский поток нашего приложения может выглядеть следующим образом: пользователь открывает приложение и входит в одну из нескольких доступных вкладок (наша база данных о котятах), затем нажимает на одного из котят (входит в подробное представление одного котёнка) и затем нажимает на раздел комментариев (входит в раздел комментариев представления котёнка).

    Пользовательский поток приложения «Purrrfect»

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

    А теперь надо понять, какой из этих экранов является модальным, а какой нет? Классификация в данном случае вызывает сложность, но вот моё личное эмпирическое правило:


    Используйте модальные экраны для автономных процессов, а немодальные экраны для всего остального.

    «Автономный процесс» — это конкретное действие, которое имеет четкую начальную и конечную точку в процессе.

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

    Google формулирует это правило следующим образом:

    Используйте модальные экраны (диалоги) для отображения «критической информации, которая требует конкретной пользовательской задачи, её решения или подтверждения» — Google

    В случае нашего приложения «Purrrfect» это означает, что основной поток пользователя (используемый для исследования приложения) не является модальным. Однако специальные ограниченные по времени действия, такие как добавление котят, редактирование котят и написание комментариев, являются модальными.

    Все модальные действия могут быть отменены либо успешно завершены, прежде чем пользователь вернется в основной поток. По этой причине модальные экраны используют кнопки «Отмена» и «Сохранить» (или другие подобные подтверждения действия) вместо кнопки «Назад». Если ваша кнопка «Назад» одновременно запускает действие сохранения на немодальном экране, вы можете рассмотреть возможность перехода на модальный экран, добавив кнопки «Отмена» и «Сохранить».

    Однако верно и следующее утверждение: если два разных действия, таких как «Отмена» и «Сохранить», не имеют смысла на вашем модальном экране (потому что они вызовут одно и то же действие), вы можете переключиться на немодальное представление. В этом случае основная навигация (например, панель вкладок) также должна оставаться видимой на экране.

    Давайте вернемся к нашему приложению. Возможный интерфейс для «Purrrfect» может выглядеть так:

    Пользовательский интерфейс «Purrrfect»

    В реальном мире различие между модальными и немодальными экранами зачастую менее очевидно. Например, полноэкранный вид изображения является модальным в большинстве приложений, хотя это не процесс или диалог. Модальный экран может также иметь смысл в других особых ситуациях, когда нужно генерировать фокус пользователя на определенном блоке информации. Если бы наш подробный экран котёнка (в центре) был конечной точкой без других действий, таких как редактирование или комментарии, мы могли бы использовать модальность (полноэкранный просмотр). Но так как он позволяет пользователям глубже переходить по информационной архитектуре и выполнять различные дополнительные действия (показывать комментарии, редактировать и т.п.), у него больше нет чёткой конечной точки, и поэтому он является частью основного потока. Следовательно, это немодальное представление.

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

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

    Конечно, интерфейс может прекрасно работать без строгого различия между модальным и немодальным представлениями. Тем не менее, концепция модальности глубоко заложена в интерфейсных экосистемах Apple, Google, Microsoft и других компаний, которые разработали соответствующие ожидания для своих постоянных пользователей.

    Как следует использовать модальность?

    К настоящему времени надеюсь что возникло общее понимание того, когда использовать модальность. Остается только один вопрос: «Как мы спроектируем модальность?». Вот быстрый чеклист для использования модальных экранов:

    • Всегда показывайте кнопку закрытия/скрытия модального окна (или «отмена», «отменить», «свернуть») в верхней панели навигации. Когда пользователь теряется, он может легко закрыть такое окно и вернуться на уровень приложения, откуда было вызвано модальное окно.
    • Кнопки отмены на iOS и Android чаще всего располагаются в верхней левой части панели навигации. Android предпочитает иконку закрытия «X», в то время как iOS предпочитает кнопку с надписью «Отмена». Тем не менее, кнопки иконок также довольно распространен и в iOS.
    • Кнопки подтверждения действия на модальном окне в iOS и Android по умолчанию расположены в верхней правой части панели навигации. Тем не менее, это размещение может быть недоступным для пользователя на устройствах с большой диагональю. Поэтому фиксированное плавающее размещение такого в нижней части экрана или в конце страницы может быть неплохим альтернативным решением.


    Многоступенчатые модальные окна

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

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

    Модальные и немодальные формы

    У меня есть приложение в VB.NET, где у меня есть основная форма (А), который открывает другую форму (B) в немодальноге состояния. Тогда из формы AI хочет открыть другую форму (C) в виде модальной.

    Есть в любом случае, чтобы сделать что-нибудь на форме В то время как форма C остается открытым?

    Есть в любом случае, чтобы сделать что-нибудь на форме В то время как форма C остается открытым?

    Кроме того, можно переключиться на интерфейс MDI.

    Не будет ли запутанным для пользователя? B, по-видимому нужно, чтобы быть доступны, но при открытии C вы нарушаете эту функциональность B.

    Тем не менее, вы можете, вероятно, использовать EnableWindow (), чтобы отключить вместо того, чтобы C модальность.

    приложения winforms программирование — модальные и немодальные проблема форм

    У меня проблема с модальностью форм под C#.NET. Допустим, у меня есть главная форма #0 (см. рисунок ниже). Эта форма представляет собой основную форму приложения, в котором пользователь может выполнять различные операции. Однако, время от времени возникает необходимость открыть дополнительные немодальные формы, чтобы выполнить дополнительные основной функционал приложения вспомогательные задачи. Скажем, это форма № 1 на рисунке. На этом #1 форма могут быть открыты несколько дополнительных модальных форм на верхней части друг с другом (#2 форма в изображении), и в конце концов, есть диалоговое окно хода выполнения, показывающий длительной эксплуатации прогресс и статус, который может занять от нескольких минут до нескольких часов. Проблема в том, что основная форма #0 не реагирует, пока вы не закроете все модальные формы (#2 на изображении). Мне нужно, что основная форма #0 будет действовать в этой ситуации. Однако, если открыть немодальные формы, в форме № 2, Вы можете работать как с модальным #2 форма и создаваемых не модальную форму. Мне нужно такое же поведение между основной вид #0 и форма № 1 со всеми его дочерних форм. Возможно ли это? Или я делаю что-то неправильно? Может быть, есть какой-нибудь обходной путь, мне очень бы не хотелось менять все вызовы метода showdialog, чтобы показать.

    Ответ 1

    Модальные формы делать именно то, что «модальное» означает, они отключить все другие окна в приложении. Это очень важно, ваша программа является в некоторой степени опасное состояние. У вас есть кусок кода, который ждет диалогового окна, чтобы закрыть. Действительно плохих вещей может случиться, если эти другие не были отключены. Как пользователь может снова запустить модальное диалоговое окно, Теперь ваш код дважды вложенными. Или она могла закрыть окно владелец диалогового окна, теперь она внезапно исчезает.

    Это точно вид проблемы, вы столкнетесь с если вы называете приложения.Функция doevents() внутри цикла. И это один из способов получить бланк вести себя модал без отключения других окон. Например:

    Это, конечно, лучше использовать модальные формы, как они были разработаны, чтобы держаться подальше от неприятностей. Если вы не хотите, чтобы модальная форма, то просто не делаю его модальным, используйте метод Show (). Подписаться на его событие FormClosing, чтобы знать, что он вот-вот закроется:


    Ответ 2

    Первое, что приходит на ум, будет что-то подобное. Вы можете отключить форма 1 при запуске формы 2, а затем уже форма 1 Ручка закрытом мероприятии во второй форме, чтобы снова включить себя. Вы бы не открыть модальное 2 через окно.

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

    Ответ 3

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

    Ответ 4

    Мне кажется, вы могли бы использовать MDI-приложения Настройки форме #0 свойство в true.

    Затем, вы могли бы сделать что-то подобное:

    С помощью как вы заявили в своем вопросе сделает все формы .

    По определению, модальная форма:

    When a form is displayed modally, no input (keyboard or mouse click) can occur except to objects on the modal form. The program must hide or close a modal form (usually in response to some user action) before input to another form can occur. Forms that are displayed modally are typically used as dialog boxes in an application.

    You can use this property [(Modal)] to determine whether a form that you have obtained from a method or property has been displayed modally.

    Так, модальная форма должна быть использована только тогда, когда вы требуете немедленной помощи/взаимодействия с пользователем. Используя модальные формы иначе заставляет поверить, что ты, возможно, работает в неправильном направлении.

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

  • What is it you want to do, apart of making your main form responsive, etc.
  • What is it you have to do?

    Объяснить, что вам нужно сделать, мы могли бы направлять вас в порядке, или, по крайней мере может быть лучше, направление.

    Илон Маск рекомендует:  Работа с реестром средствами visual basic
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL