处理WPF窗口的正确方法是什么?

时间:2009-02-20 05:33:59

标签: wpf window

我有一个WPF窗口,我通过调用Show()从另一个窗口创建,然后让它Close()。当窗口关闭时,我希望它会死掉,调用它的析构函数,并删除它的所有子元素(比如计时器......)。

调用此类操作的正确方法是什么?

5 个答案:

答案 0 :(得分:62)

Close()释放所有非托管资源,并关闭所有拥有的Window

您需要确定性处置的任何其他托管资源都应该从Closed事件处理。

Reference

(注意:删除之前的答案,这是一个完全错误的猜测)

答案 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 事件。如果收盘 事件未取消,会发生以下情况:

  1. Window 已从 Application.Windows 中删除(如果应用程序 对象存在)。

  2. 如果所有者/拥有的窗口从所有者窗口中删除 在显示拥有的窗口之前建立关系并且 在打开所有者窗口之后。

  3. 引发 Closed 事件。

  4. 由 Window 创建的非托管资源被释放。

  5. 如果调用 ShowDialog 来显示窗口,则返回 ShowDialog。

我相信这是按顺序列出的。


我不确定计时器子问题的具体内容;我认为这个问题没有足够的细节来真正回答这个问题。

相关问题