Каков правильный способ утилизации окна WPF?
У меня есть окно WPF, которое я создаю из другого окна, show() ing, а затем сам закрывает(). Когда окно закрывается, я ожидаю, что он умрет, вызовет его конструктор и удалит все его дочерние элементы (например, таймеры..).
Каков правильный способ вызова такого действия?
Ответы
Ответ 1
Close()
освобождает все неуправляемые ресурсы и закрывает все принадлежащие Window
s.
Любые другие управляемые ресурсы, необходимые для детерминированного удаления, должны обрабатываться из Closed.
Ссылка
(примечание: удаленный предыдущий ответ, это было совершенно неправильное предположение)
Ответ 2
Очень мало элементов WPF, которые действительно должны быть явно удалены, в отличие от Windows Forms.
В случае с окном вызова Close() достаточно, чтобы избавиться от всех управляемых и неуправляемых ресурсов, относящихся к документации.
Ответ 3
На всякий случай, я добавлю два цента.
Моя проблема заключалась в том, что я не делал достаточного устранения неполадок. Мое окно было дочерним окном, которое можно было открыть, закрыть и снова открыть, поэтому я добавил следующее, чтобы оно полностью не закрывалось:
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();
}
Это прекрасно работает - он удаляет обработчик событий, предотвращающий закрытие окна, и затем закрывает его.
Ответ 4
Закрытие окна и уверенность в том, что вы выпустили все ресурсы для него, и любой из его дочерних элементов приведет к сбою всех хорошо продуманных элементов в логическом дереве.
Я говорю "хорошо себя вел", потому что теоретически возможно иметь элемент, который делает что-то вроде создания потока, который не останавливается должным образом, но на практике, если вы используете базовую структуру WPF и хорошо написанные элементы управления, быть в порядке, чтобы просто отпустить все.