2010-08-06 55 views
1

如何在其他MDIChild表格上始终显示MDIChild表格?显示MDI孩子始终位于其他MDI儿童之上

我已经设置了ChildForm为True的TopMost属性,但窗体仍的工作方式......

我已经尝试设置ChildForm为True的顶级性能,并得到了错误信息......“父级控件的顶级样式不能更改。“

我该如何做到这一点。

感谢

回答

1

框架显然不支持MDI子窗口拥有彼此,所以你必须自己模仿这种行为:

static Form f1 = new Form(); 
    static Form f2 = new Form(); 
    static Form f3 = new Form(); 

    [STAThread] 
    static void Main() 
    { 
    f1.IsMdiContainer = true; 
    f2.MdiParent = f1; 
    f3.MdiParent = f1; 
    f1.Show(); 
    f2.Show(); 
    f3.Show(); 
    f2.Activated += new EventHandler(f2_Activated); 
    Application.Run(f1); 
    } 

    static void f2_Activated(object sender, EventArgs e) 
    { 
    f3.Activate(); 
    } 

我通常只是让所有的形式不是MDI子窗体。他们不停留在MDI容器中,但至少他们留在前面。

也许这个限制存在的原因是由于在容器内最大化所有者的MDI子时出现奇怪或模糊的期望行为。如果您在这种情况下点击它,上面的代码将允许拥有的表单在最大化的父级后面。如果你在容器外部有它,那么它将保持可见。

+0

您的代码工作正常。但可悲的是我不得不将这个事件连接到我的应用程序的其他任何形式。 – 2010-08-06 13:07:18

+0

当孩子被激活时,MDI家长也有一个事件。 – BlueMonkMN 2010-08-08 23:07:16

0

//编辑

因为只有你MdiChild形式之一需要集中,请尝试以下操作:

MdiChildActivate事件重新对焦或重新激活所需的窗口作为激活的子窗口。

您也可以使用Deactivated事件来强制执行相关子窗口的重新聚焦。

当您创建窗体并显示它时还会附加一个调用焦点方法。

ChildForm.Focus() 

设置焦点应该使其位于最上方。

希望它有帮助。

+0

我相信福克斯将带给形式活跃状态,并将显示它的所有其他形式...但是,当用户将焦点更改为其他形式的MDIChild时,此表单将隐藏在该表单的后面... 总之,我想实现Always on Top,但受限于我的MDIChild窗口 – 2010-08-06 12:41:45

+0

好吧,现在我得到更清晰的图片。我的解决方案应该对表单进行一次聚焦。谢谢澄清! – Vaibhav 2010-08-06 12:43:39

+0

当我在Form2的ActivateEvent上使用Activate代码时,如BlueMonk所说的那样...但是当我使用这个(顶部)窗体的Deactivate/Leave事件时,它不工作... – 2010-08-06 13:05:42

1

一个更好的解决方案,不要求改变每其他形式的: - 申报新工具箱作为控制主父的(本):

fForm fFormObj = new fForm(); 
fFormObj.TopLevel = false; 
this.Controls.Add(fFormObj); 
fFormObj.Parent = this; 
fFormObj.TopMost = true; 
fFormObj.Show(); 
+0

感谢分享! '很棒':)' – Anne 2013-01-17 19:41:05