57

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

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

4

5 回答 5

72

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

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

参考

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

于 2009-02-20T05:50:09.057 回答
13

与 Windows 窗体不同,实际上需要显式释放的 WPF 元素很少。

对于 Window,调用 Close() 足以根据文档处理所有托管和非托管资源。

于 2009-02-20T10:25:46.683 回答
11

以防万一,我会加两分钱。

我的问题是我没有做足够的故障排除。我的窗口是一个可以打开、关闭和重新打开的子窗口,所以我添加了以下内容以防止它完全关闭:

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();
}

这很好 - 它删除了阻止窗口关闭的事件处理程序,然后将其关闭。

于 2013-08-07T19:18:00.287 回答
1

关闭窗口并确信您已向其释放所有资源及其任何子级将导致逻辑​​树中所有表现良好的元素被垃圾收集。

我说“表现良好”是因为理论上可以有一个元素来执行诸如创建一个未正确停止的线程之类的操作,但实际上,如果您使用的是基本的 WPF 框架和编写良好的控件,那么您应该可以只是释放一切。

于 2009-02-20T14:44:30.633 回答
0

关于持有的资源Window,根据文档

(重点补充)

关闭窗口会引发 Closing 事件。如果未取消 Closing 事件,则会发生以下情况:

  1. Window 将从 Application.Windows 中删除(如果存在 Application 对象)。

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

  3. 引发 Closed 事件。

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

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

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


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

于 2021-04-21T12:49:47.540 回答