2009-09-30 9 views
26

Ho una finestra che contiene un UserControl personalizzato. UserControl deve sapere quando la finestra che lo contiene è stato chiuso in modo che possa terminare un thread.WPF Window.Close() non attiva l'evento UserControl.Unloaded

La mia ipotesi migliore su come eseguire ciò è gestire l'evento Unloaded di UserControl. Tuttavia, l'evento Unloaded sembra essere attivato solo quando l'utente fa effettivamente clic per chiudere la finestra, ma non quando chiamo programmaticamente il metodo Close() sulla finestra.

Per motivi di riferimento, ecco alcune delle parti rilevanti del mio codice.

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. 
} 

Quindi, solo per ricapitolare, l'UserControl_Unloaded() metodo di cui sopra viene chiamato quando chiudo la finestra "manualmente" (alt-F4, fai clic sulla "X" rossa, ecc.), ma non quando provi da un'altra parte del codice Chiamo myWindow.Close(). Qualche idea?

risposta

10

Risulta che la risposta in this question risolve il problema anche per me. Sembra ancora strano, tuttavia, che l'evento Unloaded non venga licenziato. Vai a capire.

+4

Dalla documentazione: si noti che l'evento Unloaded non viene generato dopo l'avvio di un'applicazione. L'arresto dell'applicazione si verifica quando si verifica la condizione definita dalla proprietà ShutdownMode. Se si inserisce codice di pulitura all'interno di un gestore per l'evento Unloaded, ad esempio per una finestra o un controllo utente, è possibile che non venga chiamato come previsto. –

1

Perché non connettere il gestore alla finestra. Evento chiuso? Il tuo UserControl può camminare attraverso ui tree per trovare la finestra.

+0

Non è una cattiva idea. La soluzione che ho trovato in un'altra domanda SO, però, sembra un po 'più pulita. Non molto, ma un po '. – Stephen

+4

Cosa succede se UserControl viene rimosso prima che la finestra venga chiusa? Perdita di risorse! –

3

In classe MyWindow

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


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

     } 
Problemi correlati