如何“发射并忘记”WinForms表单?

时间:2010-03-22 17:14:46

标签: .net winforms instance

创建WinForms Form实例的好方法是什么,显示它(非模态)但不必保留引用它?通常,一旦变量超出范围,表单就会关闭:

var form = new SuperDuperForm();
form.Show();
// Form has probably been closed instantly

我不想跟踪表单的实例,我希望它能够在用户关闭表单时将其处理掉。我将要实现的一个想法是我用来打开和显示表单的一种控制器,它将跟踪它们并监视何时通过回调关闭它们。

我只是想知道是否有任何巧妙的技巧可以在没有它的情况下逃脱。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

您根本不需要这样做 - Winforms会为您完成此操作。当您显示表单时,它会被添加到Application.OpenForms属性中,当您关闭表单时,它会自动删除。

Windows窗体在打开时永远不会有资格进行垃圾回收,并且在关闭时也会自动处理。引自Form.Close文档:

  

当表单关闭时,将关闭对象中创建的所有资源并处理表单。您可以通过处理Closing事件并将作为参数传递的Cancel的{​​{1}}属性设置为事件处理程序来阻止在运行时关闭表单。如果您要关闭的表单是应用程序的启动表单,则应用程序结束。

     

当表单未在关闭上处理时的两个条件是(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见; (2)您使用CancelEventArgs显示了表单。在这些情况下,您需要手动调用ShowDialog来标记所有表单的垃圾回收控件。

换句话说,对于“发射并忘记”的一般情况,资源管理是自动的。

答案 1 :(得分:1)

在没有保留对它们的引用的情况下打开表单没有问题。但是,如果您在一个单独的线程中创建表单,它将在线程退出时消失(它会立即执行,因为Show会在显示表单后立即返回。)

答案 2 :(得分:0)

我认为您可以在不保留引用的情况下实例化表单。我使用的一种技术是跟踪Dictionary myForms<sting, Form>集合。这意味着我仍然可以订阅.FormClosing事件并删除我的集合中的表单。

当然,如果你想以正确的方式做,你会使用Application.OpenForms - 请参阅Aaronaught的回答。我在阅读完他的答案后才发现了这个属性。

答案 3 :(得分:-3)

简单的“使用”条款怎么样?类似的东西:

使用(Form vForm = new Form()} {   //你的代码就在这里 )

一旦你超出“使用”的范围,该实例就会被驳回。 还有一个简单的调用作弊,例如(new Form())。Show(); 快速测试显示一个窗口,当调用方法关闭时,该窗口不会消失。