«Частично модальные» формы в приложении MDI - PullRequest
2 голосов
/ 19 мая 2011

У меня есть приложение MDI.Пользователь может открывать различные немодальные формы, например, форму A и форму B. В форме A есть кнопка, которая открывает другую форму (скажем, форму C), и то же самое относится и к форме B (кнопка, открывающая форму D).Я пытаюсь добиться, чтобы C блокировал A, а D блокировал B. ShowDialog не работает, потому что он блокирует все приложение, поэтому я попытался отключить форму A, а затем зацикливать некоторое время на булевом значении, которое установленов false, когда C закрыт (т.е. пока (заблокировано) Application.DoEvents ();).В следующих строках кода я снова включаю A, а затем использую результат, полученный из C. Это, кажется, работает, но если я открываю C из A, а затем D из B, A блокируется как C, так и D, а не толькоD. Есть ли способ достичь того, что я пытаюсь сделать?

Ответы [ 3 ]

0 голосов
/ 19 мая 2011

Вы можете использовать Form.Activate , чтобы вызвать своего рода модальность. Например, когда D блокирует B и пользователь выбирает (активирует / устанавливает фокус на) B, вы можете вызвать Form.Activate для D. Это не совсем модально, но будет обеспечивать ваши отношения между формами. Конечно, когда нет D, чтобы заблокировать B, вы бы не вызывали Activate. Этот подход также избавил бы от необходимости использовать DoEvents , поскольку ни одна форма никогда не будет заблокирована.

0 голосов
/ 15 июля 2011

В итоге решил это так:в методе А, который открывает CI1. отключить форму А2. создайте экземпляр C (и сохраните его в поле A, если мне понадобятся некоторые из его данных после закрытия C)3. прикрепить метод cClosed, определенный в классе A, к событию FormClosed экземпляра C4. открыть форму CВ методе cClosed I:1. включить форму А2. делать все, что мне нужно после закрытия C3. очистить поле, содержащее C (если присутствует)

0 голосов
/ 19 мая 2011

Может быть, было бы лучше смоделировать, что вы хотите, как это:

  1. Когда A открывает C, сохраните эту ссылку в классе A (не внутри какого-либо метода, но чтобы быть видимым для других методов)
  2. Когда форма A получает событие Activate, проверьте, виден ли C - если да, сфокусируйте его вместо этого.

То же самое относится и к B-D, и к любой комбинации ...

...