无法在主窗体的控件顶部显示子窗体

问题描述

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 窗体时,不要期望父窗体在主窗体区域有自己的控件,否则你会遇到这个确切的问题。

所以有几种方法可以解决这个问题。

首先您可以在父表单上放置一个面板,然后您的孩子可以添加到面板中。

不过,这现在是“正确的”MDI 控制,但它可能会让您实现您想要的。

ChildForm child = new ChildForm();
parentPanel.controls.add(child);  //ParentPanel needs to already be on main form

或者另一种方法是将您的父控件放在 MenuStrip(如 MS Word)上,或者您可以使用一个始终可见的浮动可停靠子窗体(想想 Visual Studio)。

如果你想做后者,那么我建议 DockPanelSuite 控件来帮助你

https://github.com/dockpanelsuite/dockpanelsuite

,

这就是 MDI 的工作原理,没有办法解决这个问题。
MDI 父窗体上的所有控件都将占用 MDI 子窗体的“客户端”空间。因此,它们将始终显示在任何 MDI 子表单的顶部。

换句话说,MDI 子窗体只能使用 MDI 父窗体上未被其他控件占用的空间。

您可以做的是在 MDI 父窗体上放置一个面板,例如将其停靠在左侧。然后将您的“主要”控件放在该面板上。 MDI 子窗体将使用 MDI 父窗体上剩余的任何空间。
您可以在此面板旁边放置一个 splitter control 以便您可以将其放大或缩小,或者将其设置为 slidable 以便当您的鼠标靠近它时面板会向前移动,并在鼠标靠近时再次隐藏自己远离它。

另一种方法您可以尝试,不再使用 MDI 并自己设置“子”表单的父级。但这很可能会导致其他问题。

我会尝试第一种方法,主窗体上的面板停靠在左侧,旁边有一个拆分器控件。