如何在 MDI 中正确显示 child 侧栏和 child 表单在 Windows 表单应用程序中?

How to properly display in MDI a child side bar and a child form in a Windows Form Application?

我正在尝试布局具有一个 child 侧边栏形式和多个 child 形式的 MDI。

当点击排列按钮时,我试图让布局如以下屏幕截图所示(边栏和最顶部打开 child 并排显示):

初始化侧边栏

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

添加新的child

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;
        }
    }
 }

为了使两个表格正确并排显示,需要 "play" 加上数字。对于宽度,我删除了 50px,对于高度,我删除了 150px。

将两种形式并排放置的正确方法是什么?

注意:MDI 可以包含多个打开的窗体,所以我不能使用 SplitContainer 或 TableLayoutPanel 例如。

创建一个mdi 窗体并在其中添加一个面板,并将面板的停靠栏属性 设置到右侧。它将变成如下屏幕截图:

使用

LayoutMdi(MdiLayout.TileVertical);

事件代码如下图所示:

在您的 MDI 表单上。它将在 MDI window 中并排排列所有打开的表单。最终屏幕截图将如下所示:

您可以使用两个面板(一个 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();

此致!

鉴于您显示的布局,在其 Resize 事件中将 SideBarForm 宽度重置为所需的尺寸应该就足够了。

首先将 SideBarForm 表单添加到 MDIChildren 集合中,将其停靠在您需要的一侧,然后 SendToBack() .这将使工具栏在停靠堆栈中具有更高的优先级。

另一个 MDI 子窗体将被停靠以填充剩余的 space。
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;
}

Mdi window 尊重停靠内容并将剩余区域用于 mdi 子 windows。

因此,对于边栏,不要将其添加为 mdi window,而是将其添加为停靠 window。对于 windows 的其余部分,将它们添加为 mdi child windows:

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();
}