创建WinForms Form实例的好方法是什么,显示它(非模态)但不必保留引用它?通常,一旦变量超出范围,表单就会关闭:
var form = new SuperDuperForm();
form.Show();
// Form has probably been closed instantly
我不想跟踪表单的实例,我希望它能够在用户关闭表单时将其处理掉。我将要实现的一个想法是我用来打开和显示表单的一种控制器,它将跟踪它们并监视何时通过回调关闭它们。
我只是想知道是否有任何巧妙的技巧可以在没有它的情况下逃脱。有什么想法吗?
答案 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(); 快速测试显示一个窗口,当调用方法关闭时,该窗口不会消失。