Soy relativamente nuevo en WPF, y algunas cosas son bastante extrañas para mí. Por un lado, a diferencia de Windows Forms, la jerarquía de control de WPF no admite IDisposable. En Windows Forms, si un control de usuario usaba recursos administrados, era muy fácil limpiar los recursos anulando el método Dispose que implementó cada control.Limpieza adecuada de los controles de usuario de WPF
En WPF, la historia no es tan simple. Lo he buscado durante varias horas y encontré dos temas básicos:
El primer tema es que Microsoft establece claramente que WPF no implementa IDisposable porque los controles WPF no tienen recursos no administrados. Si bien eso puede ser cierto, parecen haber pasado por alto el hecho de que las extensiones de usuario a su jerarquía de clases WPF pueden usar recursos administrados (directa o indirectamente a través de un modelo). Al no implementar IDisposable, Microsoft ha eliminado efectivamente el único mecanismo garantizado mediante el cual se pueden limpiar los recursos no administrados utilizados por un control o ventana personalizada de WPF.
En segundo lugar, encontré algunas referencias a Dispatcher.ShutdownStarted. Intenté utilizar el evento ShutdownStarted, pero parece que no se dispara para cada control. Tengo un montón de UserControl de WPF que he implementado un controlador para ShutdownStarted, y nunca se llama. No estoy seguro si solo funciona para Windows, o tal vez para la clase de la aplicación WPF. Sin embargo, no está disparando correctamente, y estoy filtrando objetos abiertos de PerformanceCounter cada vez que se cierra la aplicación.
¿Existe una mejor alternativa para limpiar los recursos no administrados que el evento Dispatcher.ShutdownStarted? ¿Hay algún truco para implementar IDisposable de modo que se llame a Dispose? Preferiría mucho evitar usando un finalizador si es posible.
+1 para mover recursos desechables fuera del código subyacente. Uno de los puntos clave de aprendizaje para WPF es minimizar el código subyacente para aprovechar la fortaleza y la expresividad de la arquitectura de enlace de datos. Es algo doloroso de aprender (la curva de aprendizaje es más como escalar un acantilado), pero gratificante cuando "obtienes" el modo de pensamiento WPF. –
Todos los recursos desechables están realmente en ViewModel's, que a su vez son IDisposables. Estoy realmente confundido acerca de por qué el evento Dispatcher.ShutdownStarted no se activa. El control de contador de rendimiento (y su ViewModel asociado) están realmente conectados al gráfico de WPF, ya que está incrustado en un en un . –
jrista
@Greg D: Generalmente obtengo el modelo WPF. Empecé a usar MVVM tan pronto como comprendí los conceptos básicos de WPF, y mi CodeBehind está casi desnudo (simplemente el constructor predeterminado y su llamada a InitializeComponent). La capacidad de compsabilidad y de enlace de datos de WPF es asombrosa, y nunca más volveré a los formularios de Windows si puedo. – jrista