【问题标题】:Properly Closing Secondary Form VS Application Exit正确关闭辅助表单 VS 应用程序退出
【发布时间】:2015-07-29 19:12:53
【问题描述】:

这可能是一个标准问题。我已经阅读了很多关于此的文章,但没有人指出我具体遇到的问题。

我正在开发一个 WinForm 并有一个在启动时加载的“主菜单”表单。在这个主要中有几个按钮,可以打开程序的各个模块(其他形式)。

我可以打开表单没有问题,可以关闭它并重新显示主表单没有问题。问题在于当用户点击控制框中的 (X) 时,应用程序不会退出,因为主窗体仍然存在,但被隐藏了。我知道我可以将 application.exit() 放在表单的关闭事件中。但是,如果我有一个关闭表单的按钮并想要取消隐藏主表单,则应用程序将由于 formclosure 事件而关闭。

谁能帮我理解这个原则。我不认为它应该像我认为的那样难,我真的不想使用面板。

提前致谢。

-约瑟夫

以下代码根据下面提供的答案解决了问题

private void btnHome_Click(object sender, EventArgs e)
{
    Form f1 = Application.OpenForms[0];
    f1.Visible=true;

    this.Close();
}

private void frmCostControlMain_FormClosed(object sender, FormClosedEventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible==true)
    {
        f.BringToFront();
    }
    else
    {
        Application.Exit();
    }
}

【问题讨论】:

  • 我很难理解您的问题。您能否发布一些代码或图形来说明您的问题
  • if (f.Visible==true)if (f.Visible) 相同,因为 f.Visible 已经是一个布尔值。将布尔值与true 进行比较会再次产生相同的布尔值。这就像写y = 1 * x; 而不是写y = x;。 if 语句不需要比较,只需要一个布尔值。任何产生布尔值的表达式都可以。
  • 谢谢,我会相应调整

标签: c# forms winforms


【解决方案1】:

您可以查看Application.OpenForms,看看是否有一些除了当前表单之外的非隐藏表单。如果只想查看主窗体,可以查看Application.OpenForms[0]。由于它是先打开的,所以它总是在索引 0 处。从内存中:

Form_Closed(object sender, EventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible) {
        f.BringToFront();
    } else {
        Application.Exit();
    }
}

单击关闭按钮时,您将首先取消隐藏主窗体,然后关闭当前窗体。

【讨论】:

  • 这就是问题所在。表单是否隐藏并不重要。如果用户点击控制框上的 (X),则应用程序无论如何都应该关闭。但是,如果表单是通过 VIA 代码关闭的,则不需要关闭应用程序,因为我会将其重定向到另一个表单。该代码的“隐藏”部分无法识别,“不包含隐藏的定义”但我可以使用“可见”属性也许
  • 您说“...当用户点击控制框中的 (X) 时,应用程序不会退出,因为主窗体仍然存在,但被隐藏了”。所以,当 X 被击中时,主窗体将隐藏在关闭事件中。但是当你在代码中关闭窗体时,你首先取消隐藏主窗体,这样在关闭事件中主窗体就不会被隐藏。因此,f.Visible 状态告诉您 X 是否被击中或表单是否已从代码中关闭。
  • 对不起,我不得不重新阅读您的答案以了解意图的基础。让我试试这个,看看我是否可以通过在关闭之前取消隐藏主窗体来让它工作。知道为什么“隐藏”的使用无效吗?
  • 我认为正确的属性是Visiblef.Show()Visible = true, f.Hide()Visible = false;
  • 我能够让它工作。非常感谢你。我将发布最终剪辑。这是调用隐藏表单的最有效方式吗?
【解决方案2】:

我还是不明白你的问题,但我想你可以使用 应用程序.退出()。 然后,您应该检查 FormClosed 事件的参数。 关闭原因如下:

点击 [X]: CloseReason = UserClosing

应用程序退出: CloseReason = ApplicationExitCall

你可以正确处理它

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExitCall) 
    {
        //Application.Exit();
    }
    else if (e.CloseReason == CloseReason.UserClosing)
    {
        //[X] was pressed
    }
    else 
    {
        //Many other reasons
    }
}

我想有一种更更简洁的方式来处理您的问题。 如果您提供一点更多详细信息,我想有人可以帮助您。

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多