programing

WPF 창을 올바르게 폐기하는 방법은 무엇입니까?

sourcejob 2023. 4. 24. 23:09
반응형

WPF 창을 올바르게 폐기하는 방법은 무엇입니까?

다른 창에서 WPF 창을 만들고 있는 경우Show()그럼 그대로 놔둬요.Close()그 자체입니다.창이 닫히면 창이 중지되고 소멸자를 호출하여 모든 하위 요소(타이머 등)를 삭제합니다.

이러한 행동을 일으키는 올바른 방법은 무엇일까요?

Close()관리되지 않는 모든 리소스를 해제하고 소유한 모든 리소스를 닫습니다.Windows.

그 외의 관리 대상 자원을 폐기할 필요가 있는 경우는, 「Closed」이벤트로부터 처리해 주세요.

언급

(주의: 이전 답변 삭제, 완전히 잘못된 추측)

Windows Forms 와 달리, 실제로 명시적으로 폐기할 필요가 있는 WPF 요소는 거의 없습니다.

Window의 경우 Close()를 호출하면 문서에 포함된 모든 관리 대상 및 관리 대상 외 리소스를 폐기할 수 있습니다.

만약을 위해, 나는 내 의견을 덧붙인다.

트러블 슈팅을 충분히 하지 않은 것이 문제였습니다.창문은 열거나 닫거나 다시 열 수 있는 유아용 창이었기 때문에 완전히 닫히지 않도록 다음 항목을 추가했습니다.

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
  e.Cancel = true;
  this.Hide();
}

단, Window의 경우.클로즈가 호출되었고, 창문만 숨겼습니다.나는 결국 알아채고 다음을 추가했다.

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

이렇게 하면 정상적으로 작동합니다. 창을 닫지 못하게 하는 이벤트 핸들러를 제거한 다음 창을 닫습니다.

창을 닫고 모든 리소스를 창을 닫은 후 해당 창과 그 자식 중 하나에 해방되었다고 확신하면 논리 트리의 올바르게 동작하는 모든 요소가 가비지가 수집됩니다.

"잘 행동했다"는 것은 이론적으로는 제대로 정지되지 않은 스레드를 작성하는 것과 같은 요소를 가질 수 있기 때문입니다.그러나 실제로는 기본적인 WPF 프레임워크와 잘 작성된 컨트롤을 사용하고 있다면 모든 것을 해방하는 것이 좋습니다.

가 보유하고 있는 자원에 대해서Window매뉴얼에 따르면 다음과 같습니다.

(추가)

창을 닫으면 닫힘 이벤트가 발생합니다.Closing 이벤트가 취소되지 않으면 다음과 같은 상황이 발생합니다.

  1. 응용 프로그램에서 창이 제거됩니다.Windows(어플리케이션오브젝트가 존재하는 경우).

  2. 소유 창이 표시되기 전 및 소유자 창이 열린 후 소유자/소유자 관계가 설정된 경우 소유자 창에서 창이 제거됩니다.

  3. Closed 이벤트가 발생합니다.

  4. 창에서 생성한 관리되지 않는 리소스는 삭제됩니다.

  5. 창을 표시하기 위해 ShowDialog가 호출된 경우 ShowDialog가 반환됩니다.

나는 이것이 순차적으로 나열되어 있다고 믿는다.


타이머의 서브 질문에 대해서는 구체적으로 알 수 없습니다.질문에 답변하기에는 충분히 상세하지 않은 것 같습니다.

언급URL : https://stackoverflow.com/questions/568408/what-is-the-correct-way-to-dispose-of-a-wpf-window

반응형