winforms 具有拆分容器的C# Winform MDI窗体- MdiChildren为空

kse8i1jr  于 2023-01-05  发布在  C#
关注(0)|答案(1)|浏览(195)

我正在创建一个带有一个MDI窗体的C#. Net 4.8 Winform应用程序。这个MDI窗体有几个面板和一个拆分容器。
添加子窗体时,我使用以下代码:

frm.Text = formTitleText;
frm.MdiParent = this;
frm.TopLevel = false;
frm.FormBorderStyle = FormBorderStyle.None;
frm.Dock = DockStyle.Fill;
panelDeskTop.Controls.Add(frm);
panelDeskTop.Tag = frm;
frm.BringToFront();
lblTitleChildForm.Text = $"{frm.Text}({this.MdiChildren.Length})";
frm.Show();

窗体显示在面板中,但不作为MDI子级添加。父级(This)是MDI父级,并具有IsMDIContainer属性。因此,this. MdiChildren. Length始终为0。
不知道为什么?
先谢了。

unftdfkk

unftdfkk1#

它是预期的。您已为其设置了另一个父级:panelDeskTop.Controls.Add(frm);.
请考虑以下几点:

  • MDI父窗体具有MdiClient类型的控件。当设置窗体的MdiParent时,基本上是将其添加到MdiClient控件的controls集合中。
  • 当您询问MDI父窗体的MdiChildren时,它将返回MdiClient的子窗体。
  • 一个窗体或控件一次只能有一个父级,当您将其添加到新父级的控件集合时,它将从旧父级的控件集合中移除。

现在我相信,事情更清楚了:

frm.MdiParent = this;
...
...
panelDeskTop.Controls.Add(frm);

最后一行,从父对象的MdiChildren中删除表单,这就是数组为空的原因。

    • 您真的需要MDI吗?**

看起来你不需要MDI。如果子窗体要填充主面板而不显示标题栏,那么基本上意味着它不需要MDI父窗体。只需将它设置为非顶层,并将其添加到主面板的控件集合中并显示它。

    • 可调整MDI父级侧边栏的大小**

如果你想为MDI父级提供一个可调整大小的侧边栏,那么将面板和拆分器停靠在父级的左侧就足够了,然后右侧将被MdiClient占据。

var mdiParent = new Form() { Size = new Size(700, 450), Text = "parent" };
mdiParent.Load += (obj, args) =>
{
    mdiParent.IsMdiContainer = true;
    mdiParent.Controls.Add(new Splitter()
    { Dock = DockStyle.Left, BackColor = Color.White, Width = 8 });
    mdiParent.Controls.Add(new Panel()
    { Dock = DockStyle.Left, BackColor = Color.Black });
    var child1 = new Form()
    { MdiParent = mdiParent, Text = "child1", Size = new Size(400, 300) };
    var child2 = new Form()
    { MdiParent = mdiParent, Text = "child2", Size = new Size(400, 300) };
    child1.Show();
    child2.Show();
};
mdiParent.ShowDialog();

相关问题