好吧,我在c#中做了一个多形式的应用程序。这意味着我有更多的表格,包括一个主菜单。所有表单都有一个返回主菜单的按钮(除了主菜单表单,其中包含访问特定表单的按钮) 这就是我如何进行这种转变。
this.Close();
Form1 Myform1 = new Form1()
Myform1.Show();
问题在于,当我随机关闭应用程序时,它会消失,如我所愿,但它并没有完全关闭。我的意思是它只是消失了,但它仍然运行。 为什么?以及如何完全关闭?
答案 0 :(得分:0)
您遇到的基本问题是默认情况下,当主窗体(首先显示的窗体)关闭时,Winforms程序将退出。这是因为对此表单的引用将传递给程序的Main()
方法中的Application.Run(Form)
方法。
有多种方法可以解决这个问题,但恕我直言最直接的是不关闭表格。而是在主窗体上调用Hide()
方法。这将导致它无法显示,但不会关闭。当您想要返回时,只需在该表单实例上调用Show()
,它就会再次显示。
自然地,为了实现这一点,您需要将该引用传递给可能想要使用它的任何其他代码。因此,您可以使用如下代码结束:
this.Hide(); // Not Close()!
Form1 Myform1 = new Form1(this)
Myform1.Show();
然后在Form1
类的某个地方,您准备关闭它并再次显示主窗体,您可以调用Show()
方法。这可能看起来像这样:
partial class Form1 : Form
{
private readonly MainForm _mainForm;
public Form1(MainForm mainForm)
{
_mainForm = mainForm;
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
_mainForm.Show();
}
}
另一种处理此问题的方法是首先将MainForm
传递给Application.Run()
方法。相反,调用Application.Run()
的无参数重载。但是,您将需要一些其他机制来关闭程序。例如,在适当的时间调用Application.Exit()
。
虽然这对我来说是一个非常普遍的问题,但我无法找到另一个看似完全重复的问题。但是,肯定存在大量其他相关问题,包括以下内容:
C# Application.Run without Form
Close a windows form without exiting the entire application
How can I close a login form and show the main form without my application closing?
If I close one of my forms, they all close
Methods this.hide() vs this.close()
最后两个特别相关,但不幸的是,每个人的最佳答案可能是解决问题的最差方法(即将每个表单放入自己的线程中......一个应该使用多个UI线程作为只是最后的手段,这样做肯定在这里没有被要求)。因此,请参阅上述任何一个问题中的任何建议。答案中有一些很好的信息,但也有相当多的不好的建议。