0

我有在其中打开子窗口的程序(mdi.parent)。我已经制作了位于其下一个窗口中的组件,但是,我希望该窗口在创建后永远不会真正释放,因为我只想保留它的一个实例。

这可以用代码实现:

    // This prevents this window disposing from window close button, we want always show one and only
    // one instance of this window.
    FormClosing += (o, e) =>
                            {
                                Hide();
                                e.Cancel = true;
                            };

但是,在此之后出现问题,关闭程序需要按两次关闭按钮。第一次按下关闭子窗口,第二次终止程序。这怎么能解决?

我正在使用 Winforms。

4

5 回答 5

2

正如 Habib 所说,你可以打电话Application.Exit,但是:

调用 Application.Exit 方法退出应用程序时,不会引发 Form.Closed 和 Form.Closing 事件

如果这对您很重要,您可以执行以下操作(MDI 父代码):

    private Boolean terminating;

    protected override void OnClosing(CancelEventArgs e)
    {
        if (!terminating)
        {
            terminating = true;
            Close();
        }

        base.OnClosing(e);
    }
于 2012-08-09T06:20:46.077 回答
1

调用Application.Exit()表单关闭事件。

应用程序退出 - MSDN

通知所有消息泵它们必须终止,然后在处理完消息后关闭所有应用程序窗口。

于 2012-08-09T05:51:18.277 回答
0

事件处理程序方法内部的代码FormClosing有点过于简洁。它的作用是阻止用户关闭表单,但正如您也注意到的,它也阻止以编程方式关闭表单。

这很容易通过测试每次引发事件时传递的CloseReason属性的值来解决。FormClosingEventArgs

这些将告诉您表单试图关闭的原因。如果值为CloseReason.UserClosing,那么您想要设置e.Canceltrue隐藏表单。如果该值是其他值,那么您希望允许表单继续关闭。

// This prevents this window disposing when its close button is clicked by the
// user; we want always show one and only one instance of this window.
// But we still want to be able to close the form programmatically.
FormClosing += (o, e) =>
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            Hide();
            e.Cancel = true;
        }
    };
于 2012-08-09T07:09:50.133 回答
0

用这个

       Form[] ch = this.MdiChildren;
       foreach (Form chfrm in ch)
       chfrm.Close();
于 2014-10-11T11:43:12.797 回答
-1

如果应用程序关闭时没有进行任何处理,您可以使用 Application.Exit。否则,您可以Application.OpenForms在 MDI 父级的关闭事件中检查集合并关闭所有其他打开的表单。

于 2012-08-09T06:29:05.963 回答