我正在编写一个简单的游戏,我的功能基本上应该退出应用程序,或者更确切地关闭当前在C#中打开的所有内容(我使用Windows窗体)。
private void ExitApp()
{
Application.Exit();
}
但是,什么都行不通。我尝试过使用Environment.Exit(0)
,Application.Exit
,尝试使用for循环关闭每个表单,但它只是不起作用。我注意到的是,即使我按下X按钮,解决方案也不会关闭,但是后台似乎有些东西在运行,我不知道是什么。针对类似问题浏览了Stackoverflow论坛,浏览了其他论坛,搜索了几天,但似乎没有任何帮助。
这是打开更多表单的代码:
Podešavanja p = new Podešavanja();
private void Settings_FormClosing(object sender, FormClosingEventArgs e)
{
this.Close();
Menu m = new Menu();
m.Show();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
Menu m = new Menu();
m.Show();
}
SettingsFormClosing
事件实际上只为我打开一个新表格,而不关闭前一个表格,为什么,我不知道。
非常感谢任何帮助。
答案 0 :(得分:2)
问题是您的表单都在同一个线程上运行。看看你的Program.cs文件。看看它如何调用Application.Run(New Form1())?这是您的申请表最初在申请线程上运行的地方。
所以我们在这里遇到的问题是:你正在试图关闭你的第二张表格。假设您的单个表单上有一个按钮控件。现在假设您试图告诉您的应用程序您希望关闭窗口表单,但希望按钮保持活动状态并且打开 - 疯狂吧?那么你想要做的事情本质上是一回事 - 请注意,我假设你不是多线程的。您的Form1托管您的Form2实例,因此如果处置Form1,您将无法运行Form2。我能想到的最好的方法,至少在我的头脑中,你需要在Program.cs中创建一个递归调用,并告诉它是否需要在它真正退出之前运行一个新的Form。这充其量是有问题的,但它可能就足够了。
所以让我们修改我们的Program.cs然后:
static class Program
{
//This is where we set the current form running -- or to be run.
static Form CurrentForm;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Obviously, Form 1 starts everything so we hardcode that here on startup.
CurrentForm = new Form1();
//Then call our Run method we created, which starts the cycle.
Run();
}
//This runs the current form
static void Run()
{
//Tell our program to run this current form on the application thread
Application.Run(CurrentForm);
//Once the form OFFICIALLY closes it will execute the code below
//Until that point, imagine Application.Run being stuck there
if(CurrentForm != null && CurrentForm.IsDisposed == false)
{
//If our current form is NOT null and it is NOT disposed,
//Then that means the application has a new form to display
//So we will recall this method.
Run();
}
}
//This method is what we will call inside our forms when we want to
//close the window and open a new one.
public static void StartNew(Form form)
{
//Close the current form running
CurrentForm.Close();
//Set the new form to be run
CurrentForm = form;
//Once all this is called, imagine the program now
//Releasing Application.Run and executing the code after
}
}
好的,如果你绕过它,那么关闭并打开一个新表格是件小事。我们只需在按钮点击事件上打开新表单。
在Form1.cs中:
private void OpenForm2_Click(object sender, EventArgs e)
{
Program.StartNew(new Form2());
}
在Form2.cs中
private void OpenForm1_Click(object sender, EventArgs e)
{
Program.StartNew(new Form1());
}
我将重申,这种方法是值得怀疑的......但它可能足以满足您的需求。无论类别或形式如何,它都可以通过您的应用程序进行超级重复使用。