2011-10-23 10 views
6

Cómo cancelar la inscripción a partir de un evento enrutado personalizado.WPF Custom Routed Events - ¿Cómo cancelar la suscripción?

tengo el siguiente código (muy estándar para enrutados personalizada Eventos)

//Dispatch the Video Detection Movements 
public delegate void MovementRoutedEventHandler(object sender 
               , MovementRoutedEventArgs e); 
public class MovementRoutedEventArgs : RoutedEventArgs 
{ 
    private readonly DahuaDevice _device; 
    private readonly byte[] _canals; 
    private readonly DateTime _when; 

    public MovementRoutedEventArgs(DahuaDevice device, byte[] canals, DateTime when) 
    { 
     _device = device; 
     _canals = canals; 
     _when = when; 
    } 
    public DahuaDevice Device 
    { 
     get { return _device; } 
    } 
    public Byte[] Canals 
    { 
     get { return _canals; } 
    } 
    public DateTime When 
    { 
     get { return _when; } 
    } 
} 
public static RoutedEvent MovementEvent = EventManager.RegisterRoutedEvent(
     "Movement" 
    , RoutingStrategy.Tunnel 
    , typeof(MovementRoutedEventHandler) 
    , typeof(Window) 
); 

public event RoutedEventHandler Movement 
{ 
    add { AddHandler(MovementEvent, value); } 
    remove { RemoveHandler(MovementEvent, value); } 
} 
public void RaiseMovementEvent(DahuaDevice device, byte[] canals, DateTime when) 
{ 
    RaiseEvent(new MovementRoutedEventArgs(device, canals, when) 
    { 
     RoutedEvent = MovementEvent 
    }); 
} 

ahora una clase suscribirá a este evento con esta línea:

//Receive the Movement events 
EventManager.RegisterClassHandler( 
     typeof(Window) 
    , Main.MovementEvent 
    , new Main.MovementRoutedEventHandler(MovementHandler)); 

Al cerrar la instancia de clase, Debo anular la suscripción del evento (de lo contrario, la instancia no será basura).

¿Cómo debo llamar? Intenté RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**) pero recibo una excepción ...

Cualquier ayuda de bienvenida. Gracias por adelantado.

JM

Respuesta

9

Puede utilizar el método RemoveHandler de la clase System.Windows.Window (generalmente de la clase UIElement).

El código podría ser algo como esto:

Main.RemoveHandler(Main.MovementEvent 
        , new Main.MovementRoutedEventHandler(MovementHandler)); 
+0

Muchas gracias por la respuesta rápida. –

+0

Me alegro de haber podido ayudarte. –

5

no estoy seguro si entiendo completamente lo que está haciendo, pero voy a tirar mis dos centavos.

Su llamada a EventManager.RegisterClassHandler debe colocarse en un constructor estático para la clase que desea registrar. Esto se aplicará a todas sus instancias de la clase y no debería afectar la recolección de basura.

Si desea realizar el registro/anular el registro del evento en un nivel por ejemplo, utilizar el tradicional

myEvent += myDelegate; 
myEvent -= myDelegate; 

Espero que esto ayude.

+0

Gracias por la respuesta, pero u puede utilizar directamente las teclas + y - cuando se "enrutan personalizada Eventos" ... No estoy seguro. Pondré el RegisterClassHandler en un constructor estático para evitar fugas de memoria. –

+0

Sí, puede usar + y - para eventos enrutados personalizados. Estos se utilizan en un nivel de instancia, sin embargo, dado que su solución parece querer que TODAS las instancias de la clase se suscriban al evento, EventManager.RegisterClassHandler es el camino a seguir. Sin embargo, también es importante tener en cuenta que el método registrado para el evento debe ser estático o de lo contrario obtendrá el problema de pérdida de memoria que le preocupa. Ver este [enlace] (http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/) – philt5252

Cuestiones relacionadas