Советы по настройке состояния окна Windows Forms - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть приложение Windows Forms, которое открывает дочерние формы MDI. Когда я выбираю эти формы, мне нужно установить или визуализировать его окно в Maximized. Проблема в том, что когда я перемещаюсь между открытыми формами, он возвращается к нормальному состоянию окна, а когда я снова устанавливаю состояние окна на максимизированный, он показывает переход из нормального в максимизированное состояние, и это выглядит не очень хорошо.

Как создать приложение Windows с родительской формой MDI, которая открывает много дочерних элементов MDI в развернутом состоянии окна?

Ответы [ 4 ]

3 голосов
/ 17 февраля 2010

Вот ответ, основанный на использовании MDI «Парадигма родительской формы и дочерней формы», со следующими допущениями:

  1. у вас есть элемент управления MenuStrip 'Dock =' Top на вашем MDIParentForm, и вы реализовали автоматический обработчик меню MDI & Window, как описано в: Как: создать список окон MDI с помощью MenuStrip

  2. вы создаете новые дочерние формы, которые:

    а. не имеют MaximizeBox, MinimizeBox и т. д., но могут иметь ControlBox (для их закрытия)

    б. эти дочерние формы могут быть изменяемого размера или нет: мы не будем рассматривать последствия этого здесь.

  3. Вы хотите, чтобы эти MDIChildForms отображались в развернутом виде в MDIParent Form максимально, но не затемнять меню MDIParentForm.

Хорошо: при условии, что все ваши дочерние формы полностью разработаны, «ожидая своего часа»: мы могли бы увидеть такой код в вашем коде MDIParentForm:

    // create instances of your child forms
    Form2 f2 = new Form2();
    Form3 f3 = new Form3();
    Form4 f4 = new Form4();
    Form5 f5 = new Form5();

    private void MDIParentForm1_Load(object sender, EventArgs e)
    {
        f2.Text = "subForm1";
        f3.Text = "subForm2";
        f4.Text = "subForm3";
        f5.Text = "subForm4";

        f2.MdiParent = this;
        f3.MdiParent = this;
        f4.MdiParent = this;
        f5.MdiParent = this;

        f2.Dock = DockStyle.Fill;
        f3.Dock = DockStyle.Fill;
        f4.Dock = DockStyle.Fill;
        f5.Dock = DockStyle.Fill;

        f2.Show();
        f3.Show();
        f4.Show();
        f5.Show();
    }

На этом этапе стиль заливки 'Fill, примененный к дочерним формам, сделает их полноэкранными и защитит их от скрытия меню MDIParentForm: и меню позволит вам автоматически выбирать, какой из них является передним.

Теперь, если вы хотите делать более причудливые вещи: например, изменять размеры дочерних форм, разбивать их на части, каскадировать. Вам нужно будет изменить свойство Dock этих дочерних окон: и тогда вы сможете использовать встроенные средства организации окна парадигмы MDI, как описано здесь: Как: организовать дочерние формы MDI

И если вы хотите создать несколько экземпляров одного типа предварительно определенной дочерней формы: Как создавать дочерние формы MDI ... см. Пример использования «Новая запись меню: может оказаться полезным.

3 голосов
/ 17 февраля 2010

Если вы хотите, чтобы состояние окна всегда было максимальным, я бы порекомендовал отказаться от формы MDI. В этом случае TabControl может работать лучше.

Формы MDI имеют довольно много проблем с удобством использования, поэтому они больше не используются и обычно заменяются другими элементами управления / опциями.

0 голосов
/ 17 февраля 2010

Если вы намерены отказаться от MDI, вы можете взглянуть на стыковочные платформы, такие как WeifenLuo или DigitalRune . Это бесплатно, для других вариантов вы можете посмотреть здесь: http://windowsclient.net/downloads/folders/controlgallery/tags/Windows+Forms+Docking+Windows/default.aspx


EDIT:

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

0 голосов
/ 17 февраля 2010

После прочтения ответа Ридса и особенно вашего комментария:

проблема с tabcontrol, у меня есть много элементов управления, используемых для дочерней формы

Может быть, это поможет: Не помещайте свои средства управления в Winform. Вместо этого инкапсулируйте их в UserControl (возможно, это уже работает, изменив наследование с Form на UserControl).

Теперь поместите каждый UserControl на свою собственную TabPage и установите для свойства Dock значение Fill. Теперь вы можете изменять каждый пользовательский элемент управления самостоятельно, без какого-либо вмешательства в другой элемент управления на другой вкладке (если вы не встроили ни одно соединение).

...