我有一个WPF窗口,我通过调用Show()
从另一个窗口创建,然后让它Close()
。当窗口关闭时,我希望它会死掉,调用它的析构函数,并删除它的所有子元素(比如计时器......)。
调用此类操作的正确方法是什么?
答案 0 :(得分:62)
答案 1 :(得分:13)
与Windows窗体不同,实际上需要显式处理的WPF元素非常少。
对于Window,调用Close()足以处理所有受documentation的托管和非托管资源。
答案 2 :(得分:8)
以防万一,我会加两分钱。
我的问题是我没有做足够的故障排除。我的窗口是一个可以打开,关闭和重新打开的子窗口,所以我添加了以下内容以防止它完全关闭:
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();
}
这很好用 - 它会删除阻止窗口关闭的事件处理程序,然后将其关闭。
答案 3 :(得分:1)
关闭窗口并确信已释放所有资源及其任何子项将导致逻辑树中所有表现良好的元素被垃圾收集。
我说“表现良好”,因为理论上可能有一个元素可以创建一个没有正确停止的线程,但实际上如果你使用的是基本的WPF框架和编写良好的控件,你应该好好释放一切。
答案 4 :(得分:0)
关于 <ext:runCommand>
<ext:command><![CDATA[
{
renameCollection: "XXX.foo",
to: "XXX.bar"
}
]]></ext:command>
</ext:runCommand>
持有的资源,根据 documentation:
(强调)
<块引用>关闭窗口会引发 Closing 事件。如果收盘 事件未取消,会发生以下情况:
Window 已从 Application.Windows 中删除(如果应用程序 对象存在)。
如果所有者/拥有的窗口从所有者窗口中删除 在显示拥有的窗口之前建立关系并且 在打开所有者窗口之后。
引发 Closed 事件。
由 Window 创建的非托管资源被释放。
如果调用 ShowDialog 来显示窗口,则返回 ShowDialog。
我相信这是按顺序列出的。
我不确定计时器子问题的具体内容;我认为这个问题没有足够的细节来真正回答这个问题。