显示最上面的子窗体 c#

Show top most Child Form c#

如何在我的父窗体中显示最顶部的按钮单击子窗体(带有作为填充停靠的 tabcontrol)? 它总是在父窗体的tabcontrol后面显示窗体,我什至用过:

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

还在后面显示。

请说明您正在使用哪些框架的哪些组件以及您目前所做的工作。如果没有这些信息,我建议采用以下解决方案(未经测试)。

在您的 ParentForm 的 "ButtonClick" 事件中执行此操作:

ChildForm cf = new ChildForm();
cf.MdiParent = this;
cf.Show();

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

cf.Focus();

你想要的是不可能的。控件的 MDI children 显示在名为 MdiClient 的控件上(您不能直接 select),它不是 transparent(并且不能) 并且默认情况下,始终位于 parent 形式的其他控件的后面。

所以唯一的方法就是让 MdiClient 覆盖 parent 表单中的控件:这会达到您的预期,但它也会隐藏 parent 控制何时没有显示 child 表单(再一次,MdiClient 不是,也不能是 transparent)。

所以唯一合理的方法是使用 TabControl 最大化 child 形式,而不是直接在 parent.[=20 上使用 TabControl =]

或者您可以让 TabControl 仅在没有 child windows 时显示。为此,以 parent 形式制作一个计时器,并在每个时间间隔检查一次:

if(MdiChildren.Length > 0)
   myTabControl.SendToBack();
else
   myTabControl.SendToFront();

这仅在 MDI children 始终最大化时才有效:当有任何 children 时,您的 TabControl 将不可见(无论它们是否覆盖它或不)

更新

如评论中所述,您可以 "your own MDI",方法是在 parent 表单中使用主机控件(例如 Panel)并加载 [=56] =] 该控件中的表单:

var form = new ChildForm();
form.TopLevel = false;
form.Parent = myHostPanel;
form.Show();

这将在面板内显示表单(您可以在其中找到它并在您想要的位置进行 zorder)...但是您失去了所有 MDI 管理,并且您必须跟踪您的 child ren(并在需要时处理表单事件)自己。

不会使用这个解决方案,它很笨拙,对于大型应用程序来说可能会变得混乱(除非你有一个正确的系统)

总结

因为我们在评论中讨论了这些方法

你可以用自己的方式来做你想做的事,但你会遇到任何方法的各种问题。

如果我是你,我会重新设计我的应用程序,这样你想要实现的就不需要了。如果你不能那样做,唯一明智的方法就是不要在 parent 表单中使用这些控件,而是使用 always-maximized、non-closable MDI child 表单控件,并在每次需要在 MDI children 集合中工作时跳过 window。

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

先在mdi父窗体做窗体声明public:

public partial class MdiParentForm : Form
{
    Form frm = new Form();
}

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

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

最后,这是处理程序:

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,这个问题是只要子窗体的任何点接触到它的矩形,选项卡控件就会隐藏和显示。移动子表单会很糟糕 :-)