代码之家  ›  专栏  ›  技术社区  ›  ehh

如何在MDI中正确显示Windows窗体应用程序中的子侧栏和子窗体?

  •  1
  • ehh  · 技术社区  · 6 年前

    我正在尝试布局一个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 回复  |  直到 6 年前
        1
  •  1
  •   Reza Aghaei    6 年前

    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();
    }
    
        2
  •  0
  •   Milko    6 年前

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

    当做!

        3
  •  0
  •   Brijesh Kumar Tripathi    6 年前

    创建一个MDI窗体并在其中添加一个面板,然后将面板的Dock属性设置为Right。屏幕截图如下:

    enter image description here

    使用

    LayoutMdi(MdiLayout.TileVertical);
    

    事件代码如下屏幕截图:

    enter image description here

    在MDI表格上。它将在MDI窗口中并排排列所有打开的窗体。最终屏幕截图如下:

    enter image description here

        4
  •  0
  •   Jimi    6 年前

    考虑到您显示的布局,它应该足以重置 SideBarForm 在其调整大小事件中所需度量值的宽度。

    添加 侧形的 形式到 MDIChildren 先收集,把它停靠在你需要的一边,然后 SendToBack() . 这将使工具栏在停靠堆栈中具有更高的优先级。

    其他MDI子窗体将停靠以填充剩余空间。
    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();
    }
    

    侧形的 :

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