【发布时间】:2011-03-26 07:23:12
【问题描述】:
如何始终在其他 MDIChild 表单之上显示 MDIChild 表单?
我已将 ChildForm 的 TopMost 属性设置为 True,但表单的行为方式仍然相同...
我尝试将 ChildForm 的 TopLevel 属性设置为 True 并收到错误消息...“无法更改 Parented 控件的顶级样式。”
我如何做到这一点。
谢谢
【问题讨论】:
如何始终在其他 MDIChild 表单之上显示 MDIChild 表单?
我已将 ChildForm 的 TopMost 属性设置为 True,但表单的行为方式仍然相同...
我尝试将 ChildForm 的 TopLevel 属性设置为 True 并收到错误消息...“无法更改 Parented 控件的顶级样式。”
我如何做到这一点。
谢谢
【问题讨论】:
//编辑
由于只需要关注您的 MdiChild 表单中的一个,请尝试以下操作:
在MdiChildActivate事件中重新聚焦或重新激活需要的窗口作为激活的子窗口。
您还可以使用Deactivated 事件来强制重新聚焦相关子窗口。
当您创建表单并显示它时,还附加一个对焦点方法的调用。
ChildForm.Focus()
设置焦点应使其位于顶部。
希望对你有帮助。
【讨论】:
该框架显然不支持相互拥有的 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 子项在容器内最大化时,会出现奇怪或模棱两可的期望行为。如果您在这种情况下单击上面的代码,则上面的代码将允许拥有的表单落后于最大化的父级。但是,如果您将它放在容器之外,那么它将保持可见。
【讨论】:
不需要更改所有其他表单的更好解决方案:- 将新工具箱声明为 Main Parent (this) 的 控件:
fForm fFormObj = new fForm();
fFormObj.TopLevel = false;
this.Controls.Add(fFormObj);
fFormObj.Parent = this;
fFormObj.TopMost = true;
fFormObj.Show();
【讨论】:
:)