关于mdichild:显示最热门的子窗体c#

Show top most Child Form c#

如何在我的父表单(带有一个停靠为填充的tabcontrol)中最上方显示单击按钮的子表单?
它总是在父窗体的tabcontrol的后面显示该窗体,我什至使用过:

1
2
frm.TopMost = true;
frm.BringToFront();

仍然显示在后面。


您想要的是不可能的。控件的MDI子级显示在名为MdiClient的控件(您不能直接选择)上,该控件不是透明的(并且不能是),默认情况下,它始终位于父级中其他控件的后面形成。

因此,执行此操作的唯一方法是在父窗体的控件上获取MdiClient:这将达到您期望的效果,但是当没有子窗体显示时,它也会隐藏父控件(再次, MdiClient不是,并且不能透明)。

因此,唯一合理的方法是使用TabControl最大化子窗体,而不是直接将TabControl放在父窗体上。

或者,您可以只在没有子窗口时显示TabControl。为此,请以父表形式创建一个计时器,并在每个间隔检查一次:

1
2
3
4
if(MdiChildren.Length > 0)
   myTabControl.SendToBack();
else
   myTabControl.SendToFront();

这仅在MDI子项始终最大化的情况下才有效:当有任何子项(无论是否覆盖子项)时,您的TabControl将不可见

更新资料

如评论中所述,您可以通过在父窗体中具有宿主控件(例如Panel)并在该控件中加载子窗体来拥有"自己的MDI":

1
2
3
4
var form = new ChildForm();
form.TopLevel = false;
form.Parent = myHostPanel;
form.Show();

这将在面板中显示表单(您可以在其中定位并按顺序排序)...尽管您失去了所有MDI管理,但您必须跟踪孩子(并照顾表单的事件)如果需要)自己。

我不会使用此解决方案,因为它很hacky,并且对于大型应用程序可能会变得混乱(除非您使用正确的系统)

作为总结

由于我们正在评论中讨论这些方法

您可以破解自己想做的方法,但是任何方法都会遇到各种各样的问题。

如果我是你,那么我将重新设计我的应用程序,以便不需要您想要实现的目标。如果您不能做到这一点,那么唯一的明智方法就是不将这些控件放在父窗体中,将一个始终最大化,不可关闭的MDI子窗体与这些控件一起使用,并在每次需要工作时跳过该窗口MDI儿童收藏。


这个问题让我不舒服:)。经过大量测试,我真的找不到解决方案。 BringToFront()功能和SendToBack()均无法正常工作。也许以下方法可以为您提供帮助。我使用Rectangle类的IntersectWith函数并测试表单是否与tabControl相交。如果是这样,将选项卡控件的可见性更改为false,否则为true。看一下下面的代码:

首先在MDI父表单上公开表单声明:

1
2
3
4
public partial class MdiParentForm : Form
{
    Form frm = new Form();
}

之后,初始化子窗体时,向其locationChanged事件添加一些处理程序,如下所示:

1
2
3
frm.MdiParent = this;
frm.LocationChanged += Frm_LocationChanged;
frm.Show();

最后,这是处理程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
private void Frm_LocationChanged(object sender, EventArgs e)
    {
        Rectangle tabControlRectangle = new Rectangle(tabControl1.Location, tabControl1.Size);
        Rectangle childFormRectangle = new Rectangle(frm.Location, frm.Size);
        if (tabControlRectangle.IntersectsWith(childFormRectangle))
        {
            tabControl1.Visible = false;
        }
        else
        {
            tabControl1.Visible = true;
        }
    }

多亏@Jcl,问题在于,只要子窗体的任何点接触其矩形,选项卡控件都将隐藏并显示。移动子窗体将是可怕的:-)


请说明您正在使用哪些框架的组成部分以及到目前为止已完成的工作。没有这些信息,我建议以下解决方案(未经测试)。

在ParentForm的" ButtonClick"事件中,执行以下操作:

1
2
3
ChildForm cf = new ChildForm();
cf.MdiParent = this;
cf.Show();

如果这样不起作用,您可以添加一个

1
cf.Focus();