2009-04-27 69 views
0

Есть ли способ начать диалог с модой, но вместо этого скрывать его, чтобы он отображался при изменении его в немодальном диалоге?Как я могу сделать «частично» модальный диалог?

Я хочу показать диалог, блокирующий метод, показывающий диалог. Затем, когда пользователь нажимает кнопку «Готово» в диалоговом окне, я хочу:

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

Я достиг этого результата, запустив диалоговое окно на отдельном потоке STA и используя событие для блокировки основного потока пользовательского интерфейса до тех пор, пока не будет нажата кнопка «Готово», но есть способ уловить этот метод: вы можете щелкнуть на кнопке закрытия главного окна, когда диалог виден, а главное окно закрывается, когда диалог скрыт.

Обновление

Спасибо за ответы. Извините - похоже, я неправильно понял баланс между слишком большим количеством фона и недостаточно.

Форма является модальным диалоговым окном «волшебник» - она ​​появляется, находится перед основным приложением, а затем скрыта. Что касается пользователя, то не существует нестандартной странности. Единственное различие заключается в том, что диалог вызывается из серии обратных вызовов из потока пользовательского интерфейса, поэтому я не думаю, что сделать его действительно модальным (посредством вызова ShowDialog) для его жизни. Первый обратный вызов должен отображать диалог, а затем блокировать, пока пользователь устанавливает свои настройки через диалоговый интерфейс. После этого диалог остается видимым и отображает страницу индикатора выполнения, в то время как различные другие обратные вызовы выполняются из потока пользовательского интерфейса. В конце концов форма скрыта. Пользователь не взаимодействует с основным окном, пока форма заполнена. Что касается них, он должен выглядеть 100% модальным по отношению к основному потоку пользовательского интерфейса.

(Форма представляет собой диалог для мастера Visual Studio - они приводятся из серии обратных вызовов в потоке пользовательского интерфейса). Альтернативой было бы показать диалог, скрыть его, сразу же отобразить самую верхнюю форму «прогресса», а затем скрыть это, но я думаю, что показывать один диалог - это более простой опыт для пользователя.

Снова - извините за беспорядок!

ответ

0

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

Скрытые модальные настройки диалога (так что это не видно): ShowInTaskBar = false, FormBorderStyle = None, size = {0,0}, Opacity = 0%, StartupPosition = CenterParent.

Скрытый диалог отображается в потоке пользовательского интерфейса с помощью ShowDialog. Видимое диалоговое окно отображается в отдельном потоке STA. Поток запускается перед вызовом hiddenDialog.ShowDialog в основном потоке пользовательского интерфейса.

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

важные биты кода:

void LaunchWizardForm(s) 
{ 
    // Show the wizard on its own thread. 
    ThreadStart t =() => 
    { 
    _wizard = new WizardForm(s); 
    Application.Run(new ApplicationContext(_wizard)); 
    }; 
    var thread = new Thread(t); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 

    // Block this (main UI) thread 
    _hiddenForm.ShowDialog(); 
} 

void EndModalEpisode() 
{ 
    _hiddenForm.Invoke((Action) (() => _hiddenForm.Hide())); 
} 
+0

Вам нужно быть осторожным с Opacity, он может провалиться через удаленные рабочие столы и некоторые (хотя и дерьмо) видеокарты – johnc

6

Возможно, вы хотите переосмыслить свою модель взаимодействия? Как вы это объясните своим пользователям? У них есть интернализованная модель работы компьютерных программ, и у вас есть все основания для ее устранения. Они знают о модальных диалогах, знают о немодальных диалогах, знают об инспекторах. Выберите один и примените его.

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

[после объяснения, заменен] Что случилось с отображением индикатора выполнения в модальном диалоговом окне? Начните обработку после того, как ok нажата, отключив все кнопки, только удерживая кнопку отмены? Если потребуется много времени, пользователь может отказаться от действия. Закрывайте диалог только после завершения обработки.

+0

Будем надеяться, что дальнейшее объяснение помогает прояснить взаимодействие с пользователем. – mackenir

+0

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

1

Вы можете использовать немодальное диалоговое окно, а затем проверить свой основной пользовательский интерфейс, если пользователь нажал кнопку «Готово». Если диалог моделируется, но «Готово» не нажата, не реагируйте на действия пользователей в основной форме ...

1

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

0

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

1

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

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

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

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

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