2009-03-30 3 views
0

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

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

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

ответ

2

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

15

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

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

+0

Вам нужно взглянуть на диалоговые окна AutoCAD. Очень красиво оформленный ИМХО. –

+3

AutoCAD is pricey =) –

2

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

+1

Я согласен, терпеть не могу. –

0

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

+1

"Парадигма". Извините, это меня подслушивало. –

+0

Я * определенно * Я видел «парадиму» ...? или, возможно, это просто популярное неправильное правописание? –

+0

Мне было скучно, поэтому я поднял глаза: TheSaurus говорит о парадигме. Я отредактировал ответ. – Crono

1

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

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

+0

«Для немодальных диалоговых окон Windows автоматически отключает родительское окно» Я так не думаю. И это не верно для модальных диалогов. То, что Windows делает, запускает вторичный цикл сообщений, предотвращая доступ большинства сообщений, отличных от WM_PAINT, к владельцу диалогового окна (owner! = Parent btw). –

+1

Хорошо, модельес был опечаткой. Но верно, что родители модальных диалогов отключены. Вы можете проверить это самостоятельно, используя Spy ++. Если сделать это достаточно, чтобы быть уверенным в этом. Дополнительный цикл сообщений не мешает родителям принимать сообщения, взаимодействующие с пользователем. – grover

0

По какой-то причине мне приходится сталкиваться с такой же проблемой в .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 
} 

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

Смежные вопросы