2009-09-30 18 views
26

Tengo una ventana que contiene un UserControl personalizado. El UserControl necesita saber cuándo se ha cerrado la Ventana que lo contiene para que pueda terminar un hilo.WPF Window.Close() no desencadena el evento UserControl.Unloaded

Mi mejor conjetura sobre cómo lograr esto es manejar el evento descargado de UserControl. Sin embargo, el evento descargado solo parece activarse cuando el usuario realmente hace clic para cerrar la ventana, pero no cuando llamo programáticamente al método Close() en la ventana.

Como referencia, aquí están algunas de las partes relevantes de mi código.

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

Así que para recapitular, el UserControl_Unloaded() método anterior se está llamando cuando cierro la ventana "manualmente" (alt-F4, haga clic en la "X" roja, etc.), pero no cuando esté en otro lugar del código Llamo al myWindow.Close(). ¿Algunas ideas?

Respuesta

10

Resulta que la respuesta en this question resuelve el problema para mí también. Sin embargo, parece extraño que el evento Descarga no se dispare. Imagínate.

+4

De la documentación: tenga en cuenta que el evento descargado no se genera después de que una aplicación comienza a cerrarse. El apagado de la aplicación se produce cuando se produce la condición definida por la propiedad ShutdownMode. Si coloca el código de limpieza dentro de un controlador para el evento descargado, como para una ventana o un control de usuario, es posible que no se llame como se esperaba. –

1

¿Por qué simplemente no conectar el controlador a la ventana. Evento cerrado? Su UserControl puede caminar a través del árbol ui para encontrar la ventana.

+0

No es mala idea. La solución que encontré en otra pregunta de SO, sin embargo, parece un poco más limpia. No mucho, pero un poco. – Stephen

+4

¿Qué pasa si el UserControl se elimina antes de que se cierre la ventana? ¡Fuga de recursos! –

3

En la clase MyWindow

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


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

     } 
Cuestiones relacionadas