2011-10-23 13 views
6

Come effettuare il deoregistrazione da un evento di instradamento personalizzato.Eventi instradati personalizzati WPF - Come annullare la sottoscrizione?

ho il seguente codice (molto standard per Custom Routed Eventi)

//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 
    }); 
} 

Ora una classe sottoscriveranno a questo evento con questa linea:

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

Quando chiudo l'istanza della classe, Dovrei annullare l'iscrizione all'evento (altrimenti, l'istanza non sarà raccolta di dati inutili).

Che cosa devo chiamare? Ho provato RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**) ma ottengo un'eccezione ...

Qualsiasi aiuto benvenuto. Grazie in anticipo.

JM

risposta

9

È possibile utilizzare il metodo RemoveHandler dalla classe System.Windows.Window (generalmente dalla classe UIElement).

Il codice potrebbe essere simile a questa:

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

Grazie mille per la risposta rapida. –

+0

Contento, sono stato in grado di aiutarti. –

5

non sono sicuro se capisco perfettamente quello che stai facendo, ma mi butto in miei due centesimi.

La tua chiamata EventManager.RegisterClassHandler deve essere inserita in un costruttore statico per la classe che desideri registrare. Questo si applicherà a tutte le tue istanze della classe e non dovrebbe influire sulla garbage collection.

Se si desidera effettuare il registro/unregister per l'evento a livello di singolo esempio, utilizzare il tradizionale

myEvent += myDelegate; 
myEvent -= myDelegate; 

Spero che questo aiuti.

+0

Grazie per la risposta, ma può u utilizzare direttamente i tasti + e - quando sono "Instradamento personalizzato Eventi" ... Non sono sicuro. Inserirò RegisterClassHandler in un costruttore statico per evitare perdite di memoria. –

+0

Sì, è possibile utilizzare + e - per gli eventi instradati personalizzati. Questi sono usati a livello di istanza, tuttavia poiché la tua soluzione sembra voler TUTTE le istanze della classe per iscriversi all'evento, EventManager.RegisterClassHandler è la strada da percorrere. Tuttavia è anche importante notare che il metodo registrato per l'evento dovrebbe essere statico altrimenti si otterrà il problema di perdita di memoria che si è interessato. Vedi questo [collegamento] (http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/) – philt5252

Problemi correlati