tiempo net llamar eventos evento ejemplo ejecucion desde crear codigo boton activar wpf events memory-leaks

net - ¿De qué manera los controles incorporados de WPF administran sus manejadores de eventos a un evento adjunto?



eventos vb net (1)

El uso de controladores normales en XAML no requiere referencias débiles.

Lo que está haciendo es crear una referencia de memoria entre el control principal y un control secundario contenido dentro de este control; el control infantil en este caso es el botón.

Si alguien mantiene una referencia a cualquier parte del árbol visual para el control principal, todo el árbol permanecerá en la memoria porque está vinculado entre sí (referencias padre / hijo).

Ahora, si se eliminan todas las referencias a este árbol, la referencia de evento entre padre e hijo (el control principal y el botón) no es significativa porque estos controles ya estaban vinculados mediante referencias padre / hijo. Una vez que se eliminan todas las referencias externas, este control se puede recolectar como basura.

Los controladores de eventos dentro de XAML solo crean referencias de eventos internos.

Debe tener cuidado cuando los clientes externos se registran en un evento en un control, porque está creando una referencia externa que mantendrá el control activo mientras exista el enlace y el cliente (a menos que sea una referencia débil).

Tu pregunta es sobre eventos adjuntos. No parece haber ninguna documentación clara sobre si los eventos adjuntos causan pérdidas de memoria. Me parece que el control de UI que se suscribe al evento contiene referencias al evento en lugar de al revés, pero asumo que el objeto de evento estático debe tener alguna forma de notificar al control que se ha disparado. Parece que hay una sorprendente falta de comentarios sobre esto por parte de Microsoft.

Sé que cuando registra un objeto en los eventos adjuntos del mouse, tiene pérdidas de memoria. Es por eso que necesita usar el patrón WeakEvent .

Tengo un problema con este patrón: si desea usarlo, no puede definir su controlador en el código XAML.

Para mí, significa que cada código como este se filtra:

<SomeControl Mouse.MouseDown="MyHandler" />

A menos que elimines explícitamente tu controlador en el código (y dudo que alguien lo haga). Ahora hay algo que no entiendo:

<Button Click="MyHandler" />

Este código de alguna manera utiliza el evento Mouse.MouseDown para detectar un clic en el botón. Con algunas investigaciones con reflector, descubrí que este evento usa MouseDown de la clase UIElement. Y cuando leo el código de UIElement no entiendo: ¡no hay un WeakEventManager!

¿Alguien puede explicarme cómo UIElement recibe eventos de Mouse.MouseDown sin fugas?