在从任务栏最小化后,Application.OpenForms为空

时间:2013-06-14 21:23:36

标签: c# winforms .net-4.0

我有一个包含许多最大化MDI子项的MDI父级。

我使用此代码阻止MDI父级关闭:

private void OnMainFormFormClosing(...)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;
        // Minimize to taskbar
        this.WindowState = FormWindowState.Minimized;
    }
}

然后我使用以下代码从任务栏中最大化它:

private void OnOpenToolStripMenuItemClick(...)
{
    // Maximize it from taskbar
    this.WindowState = FormWindowState.Maximized;
}

问题 - 从任务栏恢复MDI表单后,Application.OpenForms集合为空。我怎么能重新填充它?非常感谢。

1 个答案:

答案 0 :(得分:5)

这不是引起问题的代码。找到它的最好方法是将此代码粘贴到表单类中:

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
    }

并设置断点。它将在第一次创建表单窗口时触发。当它再次命中时,请查看调试器的Call Stack窗口。您将看到导致重新创建本机窗口的属性分配。

这是一个未解决的Winforms错误,一些属性很难,因为它们是原生CreateWindowEx()winapi函数中的样式标志。更改样式标志需要重新创建本机窗口。此类属性的示例是Opacity和ShowInTaskbar。这很好用,但是当窗口被销毁时,Application类会丢失对表单实例的跟踪。解决方法是避免更改该属性或停止依赖Application.OpenForms。