Как правильно отобразить в MDI дочернюю боковую панель и дочернюю форму в приложении Windows Form? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать макет MDI с одной дочерней боковой панелью и несколькими дочерними формами.

При нажатии на кнопку упорядочения я пытаюсь создать макет, как показано на следующем снимке экрана (боковая панельи самый верхний открытый ребенок отображается рядом):

enter image description here

Инициализация боковой панели

sideBarForm = new Form();
sideBarForm.MdiParent = this;    
sideBarForm.Show();
sideBarForm.Dock = DockStyle.Right;
sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
sideBarForm.Name = "sideBarForm";

Добавление нового потомка

Form childForm = new Form();
childForm.MdiParent = this;
childForm.Show();

Упорядочить макет

 private void Arrange_Click(object sender, EventArgs e)
 {
    foreach (Form child in MdiChildren)
    {
        if (child.Name != sideBarForm.Name)
        {
            child.WindowState = FormWindowState.Normal;
            child.Width = this.ClientRectangle.Width - sideBarForm.Width - 50;
            child.Height = this.ClientRectangle.Height - 150;
        }
    }
 }

Для правильного расположения двух форм рядом друг с другомТребуется «поиграть» с числами.Для ширины я удалил 50px и для высоты 150px.

Как правильно расположить две формы рядом?

Примечание: MDI может содержать несколько открытых форм, поэтому я не могу использоватьSplitContainer или TableLayoutPanel, например.

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Окно Mdi относится к закрепленному содержимому и использует оставшуюся область для дочерних окон mdi.

Итак, для боковой панели не добавляйте его как окно mdi, вместо этого добавьте его как закрепленное окно.Для остальных окон добавьте их как дочерние окна mdi:

private void Form1_Load(object sender, EventArgs e)
{
    IsMdiContainer = true;
    var sideBar = new Form();
    sideBar.Text = "SideBar";
    sideBar.TopLevel = false;
    sideBar.FormBorderStyle = FormBorderStyle.FixedToolWindow;
    sideBar.Dock = DockStyle.Right;
    this.Controls.Add(sideBar);

    var f1= new Form();
    f1.Text = "Mdi Child 1";
    f1.MdiParent = this;

    var f2 = new Form();
    f2.Text = "Mdi Child 2";
    f2.MdiParent = this;

    sideBar.Show();
    f1.Show();
    f2.Show();
}
0 голосов
/ 22 января 2019

Вы можете использовать две панели (одну DockStyle.Right и другую DockStyle.Fill) и добавлять дочерние формы к панелям, например:

        sideBarForm = new Form();
        sideBarForm.MdiParent = this;
        panelRight.Controls.Add(sideBarForm);
        sideBarForm.Show();
        sideBarForm.Dock = DockStyle.Fill;
        sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        sideBarForm.Name = "sideBarForm";


        Form childForm = new Form();
        childForm.MdiParent = this;
        panelLeft.Controls.Add(childForm);
        childForm.Show();

С уважением!

0 голосов
/ 22 января 2019

Учитывая макет, который вы показываете, этого должно быть достаточно для сброса ширины SideBarForm до желаемой меры в событии Resize.

Сначала добавьте форму SideBarForm в коллекцию MDIChildren, закрепите ее на той стороне, в которой она должна быть, затем SendToBack(). Это даст панели инструментов более высокий приоритет в стеке стыковки.

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

В MDIParent Форма:

private int sideBarSize = 150;

private void MDIParent_Load(object sender, EventArgs e)
{
    this.MinimumSize = new Size(sideBarSize * 2, sideBarSize * 2);

    SideBarForm sideBarForm = new SideBarForm(sideBarSize);
    ChildForm childForm = new ChildForm();

    sideBarForm.MdiParent = this;
    sideBarForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
    sideBarForm.Size = new Size(sideBarSize, this.ClientRectangle.Height);
    sideBarForm.Dock = DockStyle.Right;
    sideBarForm.SendToBack();
    sideBarForm.Show();

    childForm.MdiParent = this;
    childForm.BringToFront();
    childForm.Dock = DockStyle.Fill;
    childForm.Show();
}

В SideBarForm:

private int myWidth = 0;

public SideBarForm() : this(150) { }
public SideBarForm(int MySize) 
{
    InitializeComponent();
    this.myWidth = MySize;
    this.Width = MySize;
}

private void SideBarForm_Resize(object sender, EventArgs e)
{
    this.Width = myWidth;
}
0 голосов
/ 22 января 2019

Создайте форму mdi, добавьте в нее панель и установите свойство панели dock вправо. Это будет похоже на снимок экрана ниже:

enter image description here

Использование

LayoutMdi(MdiLayout.TileVertical);

Код событий будет выглядеть как на снимке экрана ниже:

enter image description here

в вашей форме MDI. Все открытые формы будут расположены рядом в окне MDI. Окончательный снимок экрана будет выглядеть следующим образом:

enter image description here

...