[英]C# Winform MDI Form with Split Container - MdiChildren is empty
我正在创建一个带有一个 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 子项。 Parent (This) 是 MDI Parent 并且具有 IsMDIContainer 的属性。 所以 this.MdiChildren.Length 始终为 0。
不确定为什么?
提前致谢。
这是预期的。 你已经为它设置了另一个父级: panelDeskTop.Controls.Add(frm);
.
考虑以下几点:
MDI 父窗体具有类型为MdiClient
的控件。 当您设置窗体的MdiParent
时,基本上是将其添加到 MdiClient 控件的控件集合中。
当您询问 MDI 父窗体的MdiChildren
时,它返回 MdiClient 的子窗体 forms。
一个窗体或一个控件,一次只能有一个父级,当您将它添加到新父级的控件集合中时,它将从旧父级的控件集合中删除。
现在我相信,它更清楚了:
frm.MdiParent = this;
...
...
panelDeskTop.Controls.Add(frm);
最后一行从父级的 MdiChildren 中删除表单。 这就是数组为空的原因。
你真的需要MDI吗?
看起来你不需要 MDI。 如果子窗体将填充主面板而不显示标题栏,那么它基本上意味着它不需要 mdi 父级。 只需将其设为非顶层并将其添加到主面板的控件集合中并显示即可。
MDI父级可调整大小的侧边栏
如果你想为 MDI parent 提供一个可调整大小的侧边栏,那么将面板和拆分器停靠在 parenr 的左侧就足够了,然后右侧将被 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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.