Временно скрыть модальный диалог - PullRequest
0 голосов
/ 30 марта 2009

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

Как я могу это сделать? Я использую Windows Forms.

Редактировать: AutoCAD делает это хорошо.

Ответы [ 6 ]

15 голосов
/ 30 марта 2009

Тогда я не думаю, что вы хотите модальный диалог ...

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

3 голосов
/ 31 марта 2009

Просто закройте модальное диалоговое окно. Он не удаляется, как обычные экземпляры Form, поэтому вы просто возвращаете его живым, устанавливая его свойство DialogResult обратно в None и вызывая ShowDialog () снова.

Обратите внимание, что вызов Hide () в модальном диалоге также закрывает его, обязательно, так как все окна вашего приложения отключены. Не отличается от Close ().

2 голосов
/ 30 марта 2009

Взгляните на http://en.wikipedia.org/wiki/Modal_window#Criticisms... Существует мысль, что в первую очередь не следует использовать модальные окна.

1 голос
/ 30 марта 2009

Вам нужно снова включить родительское окно. Для модальных диалогов Windows автоматически отключает родительское окно и включает его снова, если модальное диалоговое окно было закрыто.

Я не пробовал, но этого должно быть достаточно, чтобы установить для свойства Enabled родительской формы значение true. Если это не работает, с помощью API EnableWindow Win32 работает.

0 голосов
/ 22 июня 2010

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

Я лично не понимаю последствий с точки зрения Windows (API), но мне подходит следующее решение.

Весь трюк заключается в том, чтобы отключить основную форму перед показом модального диалогового окна (если для основной формы явно не установлено значение Enabled = false, то после скрытия модального диалогового окна взаимодействие с ним невозможно, даже когда вызывается Enabled = true).

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

void ShowDialog()
{
  var dialog = new MyModalForm();
  dialog.NeedInteraction += (sender, eventArgs) =>
  {
    dialog.Hide();
    Enabled = true;

    //wait till user finishes working with main window

    Enabled = false;
    dialog.Show();
  }

  Enabled = false;
  dialog.ShowDialog();
  Enabled = true; //don't forget to make it enabled afterwards
}

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

0 голосов
/ 30 марта 2009

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

...