2009-08-06 6 views
2

단추 클릭에서 wInstance.ShowDialog()를 호출하여 표시하는 Window 인스턴스가 있고 Alt + F4를 눌러 창을 닫습니다. 문제는 이제 wInstance.ShowDialog()를 다시 호출 할 수 없다는 것입니다. 어떻게 같은 창 인스턴스를 다시 사용할 수 있습니까?이미 닫힌 WPF 창 인스턴스를 다시 사용하는 방법이 있습니까?

예외 : 창을 닫은 후에 가시성을 설정하거나 표시 또는 표시 대화를 호출 할 수 없습니다.

+0

가능한 복제본 [WPF : 닫힌 후에 창을 다시 사용할 수 없습니다] (http://stackoverflow.com/questions/3568233/wpf-cannot-reuse-window-after-it-has-been-closed) – nemesv

+0

이것은 새로운 게시물의 중복이 될 수 없습니다 ... 물론 그 게시물은이 하나의 복제본입니까? – Sheridan

답변

9

wInstance OnClosing 메서드를 재정 의하여 창 표시 여부를 숨김으로 설정하고 닫기 이벤트를 취소해야합니다.

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     this.Visibility = Visibility.Hidden; 
     e.Cancel = true; 
    } 
+0

고마워요. 마틴입니다. 이것은 요 전날 저에게 묻고있는 질문에 대한 대답입니다. – Dennis

+0

여기에 같은 문제가 있는데이 창을 다시 사용할 때 예외가 중지되었지만 기대할 때 ShowDialog()가 true를 반환하지 못하게합니다. 이것에 대한 제안이 있습니까? –

+0

ShowDialog() 반환 값은 대화 상자가 삭제 된 방법을 나타냅니다. 이 정보가 중요하다면 창을 닫을 때 창을 실제로 처리해야하므로 닫는 이벤트를 취소하면 안되며 다시 창을 열 때 새 창을 인스턴스화해야합니다. 창의 상태 정보가 중요한 경우 유품 패턴을 고려하십시오. –

1

정확히 같은 창을 사용하는 것이 중요한 이유는 무엇입니까? MVVM을 사용하는 경우 새 창에 대해 viewmodel을 다시 사용할 수 있습니다.

+0

하지만 새로운 Window 인스턴스 작성 비용을 없애고 싶습니다. 따라서 재사용 가능성 범위가 있는지 확인하고 인스턴스에서 ShowDialog()를 다시 사용하십시오. –

+0

창가가 비싸요? – Botz3000

+0

Martin Doms의 답변은 정확하지만이 질문에 대해 궁금합니다. 이 뷰를 생성하는 오버 헤드를 과대 평가하는 것이 가능합니까? 특히 MVVM을 사용하고 VM을 유지하는 경우 특히 그렇습니다. –

0

저는 트리 뷰를 사용하는 대화 상자로 창을 재사용하고 있습니다. 클라이언트는 나뭇 가지가 더 많은 선택을 위해 열려 있기를 원합니다.

재정의가 다시 사용되어 분기가 확장 된 상태로 유지됩니다.

읽기 전용 선택 대화 상자이므로보기 모델을 사용하지 않습니다. 그러나 아직 선택을 취소 할 수 없기 때문에 뷰 모델로 전환해야 할 수도 있습니다.

관련 문제