为什么隐藏和展示一个mdi孩子会移动孩子?

时间:2014-12-19 16:05:53

标签: c# winforms mdichild

我有一个非常基本的盒子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;

即使单击当前可见表单的菜单项,也会导致它向右下方移动,与打开新表单相同。那是为什么?

编辑:

我还注意到在将表单居中并显示它时(所以你不会冒着让人在移动之前瞥见它的风险),将可见设置为真完全重置任何居中的地方。已完成。

1 个答案:

答案 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。