添加新 MDI 子项时如何避免屏幕弹跳 Window

How to avoid screen bouncing when adding a new MDI Child Window

在我的 MDI Frame 中,我正在创建 MDI Child Windows,如下所示:

Form frm = new frmMyChild();
frm.MdiParent = this;
frm.WindowState = FormWindowState.Maximized;
frm.Show();
frm.Focus();

到目前为止,这一切正常,但屏幕很快 "bouncing",因为子 windows 被置于 "normal" 状态,然后它们再次最大化。如何预防?

即使将 MenuStrip 添加到 MDI Parent 窗体,Form.MainMenuStrip 仍然是 null
当此 属性 为 null 时,MDI child 的系统菜单控件不会 与 MenuStrip(或旧的 MainMenu 混合 ]),因此 child 表单标题栏仍然可见并位于 MenuStrip 上方。
当创建并最大化新的 child 表单时,MenuStrip 弹跳 上下,同时重新创建 child 表单标题。

MainMenuStrip 属性 设置为 MDI Parent 的 MenuStrip 的实例,将导致 MDI child 的系统菜单控件变为 blend 与 MenuStrip(或 MainMenu)。

有趣的是,在 .Net Source Code 中看到这种行为和设计随着时间的推移发生了多少次变化(这只是那里的评论 :)。

TheMDIMenuStrip 是 MDI Parent 的 MenuStrip 在设计时创建并在 InitializeComponent() 中初始化。

public partial class MDIParent : Form
{
    public MDIParent()
    {
        InitializeComponent();
        this.MainMenuStrip = this.TheMDIMenuStrip;
        this.TheMDIMenuStrip.SendToBack();
    }
    ...
}

之前:

之后: