无法在主窗体的控件之上显示子窗体
Unable to display Child form on top of main form's controls
Windows 7 专业版 64 位,VS2015 或 VS2019
嗨,
我有一个带有许多不同控件的 C# Win Form。
我将主窗体定义为 MDI 父窗体,并构建了一个 MDI 子窗体,它有自己的控件,由主窗体中的菜单项激活。
子窗体构建得很好,但它始终显示在 主窗体的许多不同控件之下。
我尝试了很多补救措施,但没有一个解决了问题。
我已将子表单设置为 TopMost = true;顶级=真;每一个或全部,都无济于事。
已从 VS2015 移至 VS2019 社区 - 相同。
我一直在浪费时间来解决一些看似简单的事情。
谁能帮我解决这个问题?
//In Main Form with menustrip, ComPortSetup is a standard winform class with some controls
private void portSetupToolStripMenuItem_Click(object sender, EventArgs e)
{
ComPortSetup comPortSetup = new ComPortSetup();
comPortSetup.MdiParent = this;
comPortSetup.TopMost = true;
comPortSetup.TopLevel = true; //Can not change programmatically
comPortSetup.Show();
}
我不确定,但我相信在使用 MDI 窗体时,不希望 parent 在主窗体区域上有自己的控件,否则您将遇到这个确切的问题。
因此有几种解决方法。
首先你可以在你的 parent 表单上放置一个面板,然后你的 child 可以添加到面板中。
然而,这现在是“正确的”MDI 控制,但它可能允许您实现您想要的。
ChildForm child = new ChildForm();
parentPanel.controls.add(child); //ParentPanel needs to already be on main form
或者另一种方法是将您的 Parent 控件放在 MenuStrip(如 MS Word)上,或者您可以使用 Floating Dockable child 形式(想想 Visual Studio)然后总是可见的。
如果你想做后者,那么我建议使用 DockPanelSuite 控件来帮助你
这就是 MDI 的工作原理,没有办法解决这个问题。
MDI 父窗体上的所有控件都将带走 MDI 子窗体的“客户端”space。因此它们将始终显示在任何 MDI 子窗体的顶部。
换句话说,MDI子窗体只能使用MDI父窗体上未被其他控件占用的space。
您可以做的 是在 MDI 父窗体上放置一个面板,例如将其停靠在左侧。然后将您的“主要”控件放在该面板上。 MDI 子窗体将使用 MDI 父窗体上剩余的任何 space。
您可以在该面板旁边放置一个 splitter control
,这样您就可以将其放大或缩小,或者将其设为 slidable
,以便当您的鼠标靠近时面板会出现,当鼠标靠近时面板会再次隐藏远离它。
您可以尝试另一种方法,不再将其设为 MDI 并自行设置“子”表单的父级。但这很可能会导致其他问题。
我会尝试第一种方法,主窗体上的面板停靠在左侧,旁边有一个拆分器控件。
Windows 7 专业版 64 位,VS2015 或 VS2019
嗨,
我有一个带有许多不同控件的 C# Win Form。
我将主窗体定义为 MDI 父窗体,并构建了一个 MDI 子窗体,它有自己的控件,由主窗体中的菜单项激活。
子窗体构建得很好,但它始终显示在 主窗体的许多不同控件之下。
我尝试了很多补救措施,但没有一个解决了问题。
我已将子表单设置为 TopMost = true;顶级=真;每一个或全部,都无济于事。
已从 VS2015 移至 VS2019 社区 - 相同。
我一直在浪费时间来解决一些看似简单的事情。
谁能帮我解决这个问题?
//In Main Form with menustrip, ComPortSetup is a standard winform class with some controls
private void portSetupToolStripMenuItem_Click(object sender, EventArgs e)
{
ComPortSetup comPortSetup = new ComPortSetup();
comPortSetup.MdiParent = this;
comPortSetup.TopMost = true;
comPortSetup.TopLevel = true; //Can not change programmatically
comPortSetup.Show();
}
我不确定,但我相信在使用 MDI 窗体时,不希望 parent 在主窗体区域上有自己的控件,否则您将遇到这个确切的问题。
因此有几种解决方法。
首先你可以在你的 parent 表单上放置一个面板,然后你的 child 可以添加到面板中。
然而,这现在是“正确的”MDI 控制,但它可能允许您实现您想要的。
ChildForm child = new ChildForm();
parentPanel.controls.add(child); //ParentPanel needs to already be on main form
或者另一种方法是将您的 Parent 控件放在 MenuStrip(如 MS Word)上,或者您可以使用 Floating Dockable child 形式(想想 Visual Studio)然后总是可见的。
如果你想做后者,那么我建议使用 DockPanelSuite 控件来帮助你
这就是 MDI 的工作原理,没有办法解决这个问题。
MDI 父窗体上的所有控件都将带走 MDI 子窗体的“客户端”space。因此它们将始终显示在任何 MDI 子窗体的顶部。
换句话说,MDI子窗体只能使用MDI父窗体上未被其他控件占用的space。
您可以做的 是在 MDI 父窗体上放置一个面板,例如将其停靠在左侧。然后将您的“主要”控件放在该面板上。 MDI 子窗体将使用 MDI 父窗体上剩余的任何 space。
您可以在该面板旁边放置一个 splitter control
,这样您就可以将其放大或缩小,或者将其设为 slidable
,以便当您的鼠标靠近时面板会出现,当鼠标靠近时面板会再次隐藏远离它。
您可以尝试另一种方法,不再将其设为 MDI 并自行设置“子”表单的父级。但这很可能会导致其他问题。
我会尝试第一种方法,主窗体上的面板停靠在左侧,旁边有一个拆分器控件。