我有一个WPF窗口,我通过调用 Show() 从另一个窗口创建,然后让它 Close() 本身 . 当窗口关闭时,我希望它会死掉,调用它的析构函数,并删除它的所有子元素(例如计时器......) .
Show()
Close()
调用此类操作的正确方法是什么?
为了以防万一,我会加两分钱 .
我的问题是我没有做足够的故障排除 . 我的窗口是一个可以打开,关闭和重新打开的子窗口,所以我添加了以下内容以防止它完全关闭:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; this.Hide(); }
但是,当调用Window.Close时,它只隐藏窗口 . 我最终 grab 了并添加了以下内容:
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(); }
这很好 - 它删除了阻止窗口关闭的事件处理程序,然后关闭它 .
与Windows窗体不同,实际上需要显式处理的WPF元素非常少 .
对于Window,调用Close()就足以处理所有受documentation管理的托管和非托管资源 .
Close() 释放所有非托管资源,并关闭所有拥有的 Window .
Window
您需要确定性处置的任何其他受管资源都应该从Closed事件处理 .
Reference
(注意:删除以前的答案,这是一个完全错误的猜测)
关闭窗口并确信已释放所有资源及其任何子节点将导致逻辑树中所有表现良好的元素被垃圾收集 .
我说“表现良好”,因为理论上可能有一个元素可以创建一个没有正确停止的线程,但实际上如果你使用的是基本的WPF框架和编写良好的控件,你应该没问题 . 只是释放一切 .
4 回答
为了以防万一,我会加两分钱 .
我的问题是我没有做足够的故障排除 . 我的窗口是一个可以打开,关闭和重新打开的子窗口,所以我添加了以下内容以防止它完全关闭:
但是,当调用Window.Close时,它只隐藏窗口 . 我最终 grab 了并添加了以下内容:
这很好 - 它删除了阻止窗口关闭的事件处理程序,然后关闭它 .
与Windows窗体不同,实际上需要显式处理的WPF元素非常少 .
对于Window,调用Close()就足以处理所有受documentation管理的托管和非托管资源 .
Close()
释放所有非托管资源,并关闭所有拥有的Window
.您需要确定性处置的任何其他受管资源都应该从Closed事件处理 .
Reference
(注意:删除以前的答案,这是一个完全错误的猜测)
关闭窗口并确信已释放所有资源及其任何子节点将导致逻辑树中所有表现良好的元素被垃圾收集 .
我说“表现良好”,因为理论上可能有一个元素可以创建一个没有正确停止的线程,但实际上如果你使用的是基本的WPF框架和编写良好的控件,你应该没问题 . 只是释放一切 .