Как правильно избавиться от окна WPF? - PullRequest
49 голосов
/ 20 февраля 2009

У меня есть окно WPF, которое я создаю из другого окна, вызывая Show(), а затем позволяя ему Close(). Когда окно закроется, я ожидаю, что оно умрет, вызовет его деструктор и удалит все его дочерние элементы (например, таймеры ..).

Как правильно вызывать такое действие?

Ответы [ 4 ]

63 голосов
/ 20 февраля 2009

Close() освобождает все неуправляемые ресурсы и закрывает все принадлежащие Window с.

Любые другие управляемые ресурсы, для которых вам необходимо детерминированное удаление, должны обрабатываться из события Closed .

1010 * Reference *

(примечание: предыдущий ответ удален, это было совершенно неверное предположение)

13 голосов
/ 20 февраля 2009

В отличие от Windows Forms, очень мало элементов WPF, которые действительно должны быть явно удалены.

В случае Window вызова Close () достаточно для удаления всех управляемых и неуправляемых ресурсов в соответствии с документацией .

8 голосов
/ 07 августа 2013

На всякий случай я добавлю два своих цента.

Моя проблема заключалась в том, что я не занимался устранением неполадок. Моё окно было дочерним окном, которое можно было открывать, закрывать и снова открывать, поэтому я добавил следующее, чтобы оно не закрывалось полностью:

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

Это работает нормально - он удаляет обработчик событий, не позволяющий закрыть окно, а затем закрывает его.

1 голос
/ 20 февраля 2009

Закрытие окна и уверенность в том, что вы освободили все ресурсы для него и любого из его дочерних элементов, приведут к сбору мусора всех элементов с хорошим поведением в дереве логики.

Я говорю «хорошо себя ведет», потому что теоретически возможно иметь элемент, который делает что-то вроде создания потока, который не останавливается должным образом, но на практике, если вы используете базовую среду WPF и хорошо написанные элементы управления, вам следует можно просто выпустить все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...