显示最顶级的儿童表单c#

时间:2016-04-20 07:54:14

标签: c# mdichild mdiparent

如何在父表单中显示最顶层的按钮单击子表单(使用tabcontrol作为填充对接)? 它始终显示父表单tabcontrol后面的表单,我甚至使用过:

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

仍显示在后面。

3 个答案:

答案 0 :(得分:2)

你想要的是不可能的。控件的MDI子项显示在名为MdiClient的控件(您无法直接选择)上,该控件不透明(并且不能),并且默认情况下始终位于其他控件的后面父母表格。

所以这样做的唯一方法是将MdiClient放在父窗体的控件上:这可以达到预期效果,但是当没有显示子窗体时它也会隐藏父控件(再次,MdiClient不是,也不可能是透明的。)

因此,唯一合理的方法是使用TabControl创建最大化的子表单,而不是直接在父级上使用TabControl

或者,如果没有子窗口,您只能显示TabControl。为此,在父表单中创建一个计时器,并在每个时间间隔检查一次:

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

这仅适用于MDI儿童总是最大化的情况:当有儿童时(无论是否覆盖儿童),您的TabControl将不可见

更新

正如评论中所述,您可以拥有“您自己的MDI”,通过在父表单中拥有主机控件(例如Panel)并在该控件中加载子表单:

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

这将显示面板内的表单(您可以找到并在您想要的位置进行定位)...但是您失去了所有的MDI管理,并且您必须跟踪您的孩子(并照顾自己形成'事件,如果需要)。

使用此解决方案,它非常hacky并且可能会对大型应用程序造成混乱(除非您执行正确的系统)

作为摘要

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

你可以通过自己的方式去做自己想做的事情,但任何方法都会遇到各种各样的问题。

如果我是你,我会重新设计我的应用程序,以便不需要你想要实现的目标。如果你不能这样做,那么唯一理智的方法就是不在父窗体中使用这些控件,使用带有这些控件的始终最大化,不可关闭的MDI子窗体,并在每次需要工作时跳过该窗口MDI儿童系列。

答案 1 :(得分:0)

请解释您使用的框架的组成部分以及您目前所做的工作。没有这些信息,我建议使用以下解决方案(未经测试)。

在ParentForm的“ButtonClick”事件中执行以下操作:

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

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

cf.Focus();

答案 2 :(得分:0)

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

首先以mdi父表格形式公开表单声明:

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,问题是只要子表单的任何一点触及其矩形,选项卡控件就会隐藏和显示。移动孩子的表格会很糟糕:-)