2009-09-30 12 views
26

Mam okno, które zawiera niestandardową kontrolkę UserControl. UserControl musi wiedzieć, kiedy okno zawierające je zostało zamknięte, aby mogło zakończyć wątek.Okno dialogowe WPF Window.Close() nie wyzwala zdarzenia UserControl.Unloaded

Moim najlepszym przypuszczeniem, jak to zrobić, jest obsługa zdarzenia Unloaded UserControl. Jednak zdarzenie Unloaded wydaje się być uruchamiane tylko wtedy, gdy użytkownik kliknie, aby zamknąć okno, ale nie wtedy, gdy programowo wywołam metodę Close() w oknie.

Dla odniesienia, oto niektóre z istotnych części mojego kodu.

MyWindow.xaml:

<Window x:Class="Namespace.MyWindow" 
     xmlns:controls="clr-namespace:Namespace.Controls"> 
    <controls:MyControl/> 
</Window> 

MyControl.xaml:

<UserControl x:Class="Namespace.Controls.MyControl" 
      Unloaded="UserControl_Unloaded"/> 
    <!-- Stuff --> 
</UserControl> 

MyControl.xaml.cs:

void UserControl_Unloaded(object sender, RoutedEventArgs e) 
{ 
    // Stop the thread. 
} 

Więc po prostu zakręcić The UserControl_Unloaded() metoda powyżej jest wywoływana, gdy zamykam okno "ręcznie" (alt-F4, klikam na czerwonym "X" itp.), ale nie wtedy, gdy z innego miejsca w kodzie Dzwonię pod numer myWindow.Close(). Jakieś pomysły?

Odpowiedz

10

Rozwiązuje odpowiedź w this question rozwiązuje problem dla mnie też. Wydaje się jednak dziwne, że rozładowane wydarzenie nie zostaje wyrzucone. Domyśl.

+4

Z dokumentacji: Zwróć uwagę, że zdarzenie Unloaded nie jest wywoływane po zamknięciu aplikacji. Zamykanie aplikacji następuje, gdy wystąpi warunek zdefiniowany przez właściwość ShutdownMode. Jeśli umieścisz kod czyszczenia w module obsługi dla zdarzenia Unloaded, na przykład dla Window lub UserControl, może on nie zostać wywołany zgodnie z oczekiwaniami. –

1

Dlaczego po prostu nie podłączać programu obsługi do okna. Zdarzenie zamknięte? Twój UserControl może przejść przez drzewo ui, aby znaleźć okno.

+0

nie jest złym pomysłem. Rozwiązanie, które znalazłem w innym pytaniu dotyczącym SO, wydaje się jednak trochę czystsze. Niewiele, ale trochę. – Stephen

+4

Co się stanie, jeśli UserControl zostanie usunięte przed zamknięciem okna? Wyciek zasobów! –

3

W klasie MyWindow

this.Closing += new System.ComponentModel.CancelEventHandler(Window1_Closing); 


void Window1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 
      call User Control Method() 

     }