2014-06-06 4 views
2

오늘 문제가 있었는데 해결하는 동안 WPF에서 이상한 것을 발견했습니다. 창을 표시하지 않고 창을 인스턴스화하는 방법은 무엇입니까?

는 새 WPF 응용 프로그램을 만들, 문제를 볼 버튼을 추가하고 이벤트를 클릭하십시오 :

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var window = new MainWindow(); 
} 

응용 프로그램을 시작 및 작동 버튼을 클릭하지 않고 닫을.

응용 프로그램을 시작하면 버튼을 클릭하고 닫으면 응용 프로그램이 작동하지 않습니다.

응용 프로그램은 메모리에 남아 있습니다. 몇 달 전 나는 similar issue을 가졌지 만, 그 해결책을 사용하면 또 다른 이상한 일이 발생합니다. 응용 프로그램을 종료 할 때 표시되지 않는 창에 대해 Window.Closed 이벤트가 발생합니다.

질문 : 창을 인스턴스화 할 때 WPF는 무엇을 수행합니까? 왜 다른 클래스처럼 인스턴스화 할 수없는 이유는 무엇입니까? 나는 언제나 그것을 표시해야합니까?

+0

죄송합니다. 귀하가 성취하고자하는 바를 오해했습니다. 메인 윈도우/외부 윈도우를 닫을 때 윈도우를 생성하고 자동으로 파괴하려고합니까? – rae1

+0

@ rae1, 일종의. 창에 어떤 일이 일어나 든 상관 없어요. 인스턴스를 필요로합니다. (xaml, init 등을로드 할 것입니다.) 그래서 사용할 수 있습니다. 그러나 창을 전혀 표시하고 싶지 않습니다. – Sinatr

답변

1

나는 당신이 틀린 관점에서 이것을보고 있다고 생각합니다. 표시하지 않으려면이 방법으로 창을 만들 필요가 없습니다.

직면 한 문제는 클릭 이벤트 (사용자가 Close에 전화 할 때 발생하는)에서 처리되지 않은 클릭 이벤트로 생성 한 창 때문이며 UI 루프가 계속 실행되고 응용 프로그램이 종료되지 않습니다.

당신은 당신은 그래서 당신이 OnClosed 이벤트가 호출 될 때 참조를 유지할 수있는 전용 필드를 사용해야합니다, 당신은 같은 가시/외부 창을 닫을 때 또한 Close를 호출하여

private Window window; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     window = new MainWindow(); 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     if (window != null) 
     { 
      // Call Close on the window you created when the main main closes 
      window.Close(); 
     } 

     base.OnClosed(e); 
    } 

을이 문제를 방지 할 수 있습니다 .

나는 이것을 간단한 WPF 응용 프로그램으로 테스트했습니다. 그러나 이 클릭 이벤트에서 동일한 창 유형 (즉, MainWindow)을 인스턴스화해서는 안됩니다. 나는 이것을 단순화하기 위해했지만, 그것은 완전히 불필요한 것입니다.

+0

이것은 작동합니다. 이제는 윈도우의 로컬 인스턴스에 대해 Close를 호출하면 전체를 닫을 것이기 때문에 (* multiple window * solution) (http://stackoverflow.com/a/22605376/1997232) 어떻게 적용할지 생각해야합니다. 신청. App.xaml에 대한 속성이 있다고 생각합니다. – Sinatr

+0

다시 한번 아키텍처를 다시 생각해야 할 수도 있습니다. 이는 모든 해킹 효과 때문이며 애플리케이션 전체에 구현해서는 안되기 때문입니다. 어느 쪽이든 도와 드리겠습니다. =) – rae1

+0

나는 '해킹'을 사용해야한다. 나는 오래된 질문에 현상금을 더하고 누군가가 더 나은 건축을 제안 할 수 있는지 알아볼 수있다. 그리고 네, 이벤트를 떠나기 전에 창을 닫으면 모든 마법이 이루어집니다. 누락 된 것은'App.xaml'에서'ShutdownMode = "OnExplicitShutdown"입니다. – Sinatr

관련 문제