Methods this.hide() vs this.close()



我的c#windows表单应用程序有5个表单,我正在一个接一个地显示。当用户点击下一个按钮时,我给出的代码是:

new Form1().Show();
this.Hide();

但是,我不希望我当前的表单被隐藏。我想关闭/处理它,这样它就不会占用内存。我想发布它的资源,比如图像和变量,一旦我完成了它。为此,我尝试实现:

new Form1().Show();
this.Close();    //Form 2

但这只是关闭了这两种形式。我甚至试着交换上面两行的位置:

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

但这也起到了同样的作用。

如何在完成一个表单后立即释放该表单的资源?因为当我尝试使用重新打开Form 2时,我的程序抛出内存不足异常

new Form2().Show();
this.Hide();

您可以在新的thread中启动NewForm并创建新的消息循环

当主消息循环关闭时,应用程序将退出。在Windows窗体中,当Exit方法被称为时,此循环将关闭

有关更多信息,请参阅此处。

var th = new Thread(() => Application.Run(new NewForm()));
th.SetApartmentState(ApartmentState.STA); // Deprecation Fix
th.Start();
this.Close();

另一种方法是自己管理应用程序上下文。这里有一个小演示:

 [STAThread]
 static void Main()
 {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     using (var myApplicationContext = new MyApplicationContext(new Form1()))
     {
        Application.Run(myApplicationContext);
     }
 }

您可以通过以下方式定义定制的ApplicationContext

public class MyApplicationContext : ApplicationContext
{
    public MyApplicationContext(Form mainForm)
        :base(mainForm)
    {
    }
    protected override void OnMainFormClosed(object sender, EventArgs e)
    {
        if (Form.ActiveForm != null)
        {
           this.MainForm = Form.ActiveForm;
        }
        else
        {
           base.OnMainFormClosed(sender, e);
        }
    }
}

现在,您可以在Button.Click事件处理程序上执行以下操作:

var f = new Form();
f.Show();
this.Close();

应用程序将继续运行。基本上,通过这种方式,你可以在至少有一个活动表单的情况下保持应用程序的活力。

注意还没有测试过,但应该可以工作。

关闭程序在其主函数中启动的窗体将关闭应用程序,一个想法是有一个父窗体并使其成为主窗体,而永远不要关闭它,如果你愿意,这可以是一个隐藏的窗体。

我很久以前就不使用Windows窗体了,但在本页上发现了您行为背后的原因:
http://msdn.microsoft.com/en-us/library/ms157902(v=vs.110).aspx

通常,应用程序的主函数调用此方法将应用程序的主窗口传递给它。此方法添加事件处理程序到Closed事件的mainForm参数。这个事件处理程序调用ExitThread来清理应用程序。

同样关于这个问题,当我关闭启动表单时,我如何防止应用程序终止?有一个关于相同的讨论

我不确定它是否适用于您。但当我在处理登录表单时遇到同样的问题时……我只是使用了ShowDialog()而不是Show(),(对我来说,它解决了问题)就像:

        this.Hide();
        MainForm MForm = new MainForm();
        MForm.ShowDialog();
        this.Close();

默认情况下,C#窗体应用程序在Program.Main()方法中创建一个"根"窗体,并将其传递给application.Run()方法。关闭此表单后,您的程序将退出。

但是,您可以通过使用不同的Application.Run()重载来更改此行为。只是不要将Form实例传递给Run()。相反,在调用Application.Run()之前显示表单,然后稍后(当您最终希望程序退出时)使用Application.ExitThread()方法告诉Application类您准备关闭应用程序。

最新更新