C# - 标题栏“X”不关闭程序和表单切换

时间:2011-05-13 14:19:28

标签: c# user-interface windows-forms-designer

我有一个使用windowsforms的Visual C#项目,当在第一个表单以外的任何表单上单击X时,该窗口不会退出。我认为这可能与我的表格切换有关?

目前,我有一个Template.CS,听起来就是这样。我的所有使用形式都通过以下方式扩展:

public partial class Welcome : ADL.template

然后,我通过调用此方法在表单之间切换:

    public static void formSwitch(Form in_form, Form out_form)
    {
        in_form.Hide();
        out_form.Show();          
    }

被叫:

Program.formSwitch(this, new frmUserInput());

我认为这里发生的是,X正在关闭表单而不是应用程序,因为起始表单是隐藏的,而不是关闭的。我有更好的方式在表单之间切换吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

在回答你的问题之前,我应该指出Hide实际上并没有关闭你的表格,它只是(顾名思义)隐藏它。因此,随着时间的推移,你将继续堆积在表格上,直到你用完GDI对象或内存不足,无论哪种方式你都会崩溃。

您对应用程序未关闭的原因有点正确:即使您关闭当前表单,所有其他表单仍然已加载,因此您的应用程序不会结束。

要解决此问题,最好的方法是在不再需要表格时实际关闭表单。您甚至不必添加任何代码来关闭您的应用程序。

现在,如果您因任何原因不想这样做,您可以随时拨打Application.Exit。我强烈反对你不要追求这个“解决方案”。

修改:对于可能的解决方案,您可以将 Program.cs 更改为:

static class Program
{
  static Form NextForm=new frmLogin();   // or whatever your first form is
  static public void SetNext(Form next) { NextForm=next; }
  static void Main()
  { 
    while(NextForm!=null)
    {
      Form _next=NextForm;
      NextForm=null;      // so it closes at the end
      Application.Run(NextForm);
    }
  }
}

然后你的formSwitch会变成:

public static void formSwitch(Form in_form, Form out_form)
{
    Program.SetNext(out_form);
    in_form.Close();
}

看起来很奇怪,因为您的工作流程对于Windows程序来说很奇怪。这更像是在DOS下运行的1970 FORTRAN程序的工作流程。

答案 1 :(得分:0)

默认的Windows窗体应用程序行为是:当MAIN窗口关闭时,应用程序将关闭。

主窗口是您创建的第一个窗口。当您在此窗口上调用Hide()时,它将呈现为不可见(但仍然存在)。因此,关闭第二个窗口不会关闭应用程序。

答案 2 :(得分:0)

您可以按以下方式编辑~/Program.cs文件中的代码:

static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form f = new Form();
        f.Show();

        Application.Run();
    }
}

这样,在您私下调用Application.Exit()之前,应用程序不会关闭。