Управление многими формами одновременно - PullRequest
0 голосов
/ 17 октября 2010

Предположим, у меня есть следующая задача.

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

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

Как бы вы решили эту проблему?

Текущее решениеоснован на использовании хуков.Это не очень легко понять и очень сложно поддерживать (в основном потому, что я не опыт в win32).Он работает нормально примерно в 90% случаев, но в 10% - нет.

Может быть, требования к поведению форм являются строгими?

Ответы [ 3 ]

1 голос
/ 17 октября 2010

Я бы порекомендовал использовать некоторый оконный менеджер, поэтому каждая кнопка скажет оконному менеджеру переключать видимость формы X, если X там нет, он будет показан, если он есть, он будет закрыт.Вы должны иметь возможность настроить окна таким образом, чтобы они не отображались на панели задач.Для наглядности я не уверен, что вы имеете в виду.Когда вы открываете форму с помощью кнопки, она обычно идет вперед, что должно быть в порядке.Если вы переключите окно тогда, что вы ожидаете?Должно ли главное окно всегда оставаться на заднем плане или оно может выходить вперед, когда сфокусировано?Всякий раз, когда я видел, как приложения изменяют такое стандартное поведение, они каким-то образом терпели неудачу.Появились либо неправильные окна, либо некоторые из них были недоступны, либо пользователь просто растерялся, потому что эти окна не действовали, как все другие окна.

0 голосов
/ 17 октября 2010

Это не проблема.Используйте перегрузку Show (owner) для отображения формы.

Собственная форма всегда находится сверху ее владельца.Он сворачивается автоматически при сворачивании главного окна.Нет необходимости для ShowInTaskbar.Другой оконной моделью, поддерживаемой winforms, является MDI, проверьте свойство MdiParent.Дочерние окна ограничены рамками основного окна.Также рассмотрите возможность использования UserControls вместо формы, вы можете менять их местами по мере необходимости.Или интерфейс с вкладками, используя TabControl.Пакет Weifenluo DockPanel - очень популярная реализация оконной модели в стиле Visual Studio, поддерживающая окна, которые можно закрепить и перемещать в главном окне.Много вариантов здесь:)

0 голосов
/ 17 октября 2010

Вот как можно выполнить большинство ваших требований:

  • Установите Владелец каждой дочерней формы в качестве основной формы.

MSDN Цитата:

Когда форма принадлежит другой форме, она закрывается или скрывается вместе с формой владельца.Например, рассмотрим форму с именем Form2, которая принадлежит форме с именем Form1.Если Форма 1 закрыта или свернута, Форма 2 также закрыта или скрыта.Собственные формы также никогда не отображаются за формой их владельца.Для окон можно использовать собственные формы, такие как окна поиска и замены, которые не должны исчезать при выборе формы владельца.Чтобы определить формы, которые принадлежат родительской форме, используйте свойство OwnedForms.

  • Чтобы запретить отображение формы на панели задач, необходимо установить ShowInTaskBar свойство
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...