什么是正确的方式来处理WPF窗口?
我有一个WPF窗口,我从另一个窗口创build,show()ing,然后让它closures()本身。 当窗口closures,我期望它死了,调用它的构造函数,并删除所有的子元素(如定时器..)。
调用这种行为的正确方法是什么?
Close()
释放所有非托pipe资源,并closures所有拥有的Window
。
任何其他需要确定性处置的托pipe资源都应该从Closed事件中处理。
参考
(注意:删除以前的答案,这是一个完全错误的猜测)
与Windows窗体不同的是,实际上需要显式部署的WPF元素非常less。
在Window的情况下,调用Close()足以根据文档处理所有托pipe和非托pipe资源。
以防万一,我会加两分钱。
我的问题是我没有做足够的故障排除。 我的窗口是可以打开,closures和重新打开的子窗口,所以我添加了以下内容以防止完全closures:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; this.Hide(); }
但是,当调用Window.Close时,它只隐藏窗口。 我最终抓住并添加了以下内容:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; this.Hide(); } public void Close() { this.Closing -= Window_Closing; //Add closing logic here. base.Close(); }
这工作正常 – 它删除事件处理程序,防止窗口被closures,然后closures它。
closures窗口并确信已释放所有资源给它及其任何子项将导致逻辑树中所有performance良好的元素被垃圾收集。
我说“行为良好”是因为理论上可能有一个元素像创build一个没有正确停止的线程,但是在实践中,如果你使用的是基本的WPF框架和写得很好的控件,你应该没问题只是释放一切。