过渡到另一种形式

时间:2015-10-10 17:20:49

标签: c# forms

好吧,我在c#中做了一个多形式的应用程序。这意味着我有更多的表格,包括一个主菜单。所有表单都有一个返回主菜单的按钮(除了主菜单表单,其中包含访问特定表单的按钮) 这就是我如何进行这种转变。

this.Close();
Form1 Myform1 = new Form1()
Myform1.Show();

问题在于,当我随机关闭应用程序时,它会消失,如我所愿,但它并没有完全关闭。我的意思是它只是消失了,但它仍然运行。 为什么?以及如何完全关闭?

1 个答案:

答案 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线程作为只是最后的手段,这样做肯定在这里没有被要求)。因此,请参阅上述任何一个问题中的任何建议。答案中有一些很好的信息,但也有相当多的不好的建议。