2010-09-10 18 views
8

tengo un miembro en el código WPF detrás que es desechable (lo que significa que implementa la interfaz IDisposable)de control WPF que contiene un miembro de IDisposable

no veo cualquier método Dispose puedo anular de control de usuario en WPF de modo que pueda deseche el miembro en mi wpf usercontrol

¿Cuál es la forma correcta de deshacerse de un miembro en un control de usuario de WPF?

Es un control de usuario que envuelve a un miembro privado que implementa la interfaz IDisposable. Por lo tanto, tengo que deshacerme de ese miembro en algún lugar. En la forma tradicional de winform, el control de usuario tenía un método Dispose que podía ser anulado para que en la anulación pudiera deshacerme del miembro privado. Pero en el control de usuario de WPF, no existe tal cosa. Así que me preguntaba dónde puedo deshacerme del miembro privado en el wpf usercontrol.

Mi pregunta no se trata de disponer el control de usuario, pero donde a disponer uno de sus miembros privada que implementa la interfaz IDisposable

+1

¿Realmente * necesita * llamar a Dispose()? ¿Es este tu propio control de WPF? ¿Envuelve el código no administrado que debe limpiarse? ¿O usa mucha memoria y por lo tanto requiere que use Dispose() para forzar al GC a limpiarse antes? Todavía tengo que llamar a Dispose() en cualquiera de mis UserControls, y aún no he visto fugas de memoria. ¿Puede proporcionar más información aquí sobre UserControl? – Dave

+0

ver mi respuesta actualizada a continuación: * podría * hacer el truco para que usted no tenga que agregar un controlador de eventos descargado. – Dave

Respuesta

2

Se podría utilizar el evento sin carga del control de usuario para hacer su limpieza de recursos.

+0

¿Es esta la forma estándar de hacerlo? – pdiddy

+2

La forma estándar sería eliminar el código detrás a través de algo así como un patrón MVVM/MVP o similar y tratar con la Disposición en un nivel superior. – MrDosu

+2

Eso no funcionará. Desde la documentación de MSDN: 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. –

0

ACTUALIZACIÓN

Cuando se llama a su miembro privado que implementa IDisposable, se puede utilizar using? De esta manera, se elimina de forma automática. Personalmente no lo he hecho de esta manera en un UserControl, pero podría ser el truco. p.ej.

using(MyPrivateDisposable mpd = new MyPrivateDisposable) { 
    mpd.MethodA(); 
} 

vieja respuesta

Si no puede llamar a Dispose(), el problema es que su control de usuario no hereda de desechables(). Control de usuario en sí mismo no se deriva de ella por lo que tiene que hacer de forma explícita el control de WPF heredar de ella, es decir

public class MyControl : UserControl, IDisposable {...} 

Ver los tipos base UserControl aquí:

alt text

Una vez que implementa IDisposable, que puede llamarlo Pero como escribí en mi comentario a su pregunta, creo que necesita publicar más información sobre esta clase. Pregúntese si realmente necesita llamar a Dispose() en él ... es decir, ¿maneja su acceso UserControl, o usa código no administrado? De lo contrario, no veo por qué tendrías que llamar a Dispose() sobre él a menos que realmente quisieras que el GC lo limpiara.

+0

Entiendo que usercontrol en wpf no implementa IDisposable. Pero mi pregunta no es sobre la eliminación del control de usuario .... – pdiddy

+0

Ok, parece que editó su pregunta nuevamente, gracias, veo que implementa IDisposable. – Dave

+0

@pdiddy ok, ahora entiendo lo que estás preguntando. – Dave

1

Lo haría en el controlador de eventos Dispatcher.ShutDownStarted. Vea this question para más detalles (que a su vez se refiere a this blog post).

Cuestiones relacionadas