我有一个非常基本的盒子mdiparent,它有许多mdichildren和一个菜单项。菜单项上的每个按钮隐藏所有表单,然后显示与该按钮相对应的一个表单。
当我这样做时:
//dontHide is the Form we want to show.
for(int i = 0; i < this.MdiChildren.Length; i++)
{
if (this.MdiChildren[i] != dontHide)
{
this.MdiChildren[i].Visible = false;
}
}
dontHide.Visible = true;
切换表单会导致打开的新表单位于旧表单的下方和右侧,但单击当前显示的表单的菜单项不会执行任何操作(如预期的那样)。
但是,当我这样做时:
//dontHide is the Form we want to show.
for(int i = 0; i < this.MdiChildren.Length; i++)
{
this.MdiChildren[i].Visible = false;
}
dontHide.Visible = true;
即使单击当前可见表单的菜单项,也会导致它向右下方移动,与打开新表单相同。那是为什么?
编辑:
我还注意到在将表单居中并显示它时(所以你不会冒着让人在移动之前瞥见它的风险),将可见设置为真完全重置任何居中的地方。已完成。
答案 0 :(得分:3)
这是由Winforms中一个模糊的实现细节引起的。 Windows内置的本机MDI支持不支持隐藏子窗口。 Winforms通过在将Visible属性设置为false时销毁子窗口来解决此限制。当你把它重新设置为真时重新创建它。
这会产生各种副作用,当然会发生本机窗口的状态。 Winforms对从其属性中再次恢复窗口提供了相当不错的支持。但不做的一件事是在同一位置重新创建窗口。因此,您将看到它在新MDI子窗口获取的位置重新创建,与前一个窗口交错。无论是监督还是故意,对我来说都不是那么明显,后者的可能性为95%。
否则简单易用,您可以自己分配Location属性以将其恢复到原来的位置:
var loc = dontHide.Location;
dontHide.Visible = true;
dontHide.Location = loc;
或者只是将MDI子窗体的StartPosition设置为Manual。