Подтвердить что ты не робот

Каков правильный способ утилизации окна WPF?

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

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

4b9b3361

Ответ 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 и хорошо написанные элементы управления, быть в порядке, чтобы просто отпустить все.