2011-10-23 22 views
6

Bir Özel Yönlendirilmiş Olaydan Nasıl Hata Bildirilir.WPF Özel Yönlendirilmiş Etkinlikler - Nasıl Abone Olunur?

Ben şu kod (Özel Yöneltilmiş Etkinlikleri için çok standart)

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

Şimdi bir sınıf bu hat ile bu olaya abone olacak:

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

Sınıf örneğini kapatın Etkinliği Abonelikten kaldırmalıyım (aksi halde örnek çöp toplanmayacaktır).

Neyi arayayım? RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**)'u denedim ama bir istisna aldım ...

Herhangi bir yardım gelebilir. Şimdiden teşekkürler. Tamamen ne yaptığınızı anlarsanız

JM

cevap

9

System.Windows.Window sınıfından (genellikle UIElement sınıfından) RemoveHandler yöntemini kullanabilirsiniz.

kod şöyle görünebilir: cevap için

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

Hızlı cevap için çok teşekkürler. –

+0

Sevindim ki sana yardım edebildim. –

5

emin değilim, ama benim iki sent atmak gerekir.

EventManager.RegisterClassHandler çağrınız, kayıt olmak istediğiniz sınıf için statik bir kurucuya yerleştirilmelidir. Bu, sınıfınızın tüm örneklerine uygulanacak ve çöp toplama işlemini etkilememelidir.

bir örneği başına düzeyde etkinliğe kaydını/kayıt yapmak istiyorsanız, bu yardımcı olur geleneksel

myEvent += myDelegate; 
myEvent -= myDelegate; 

Umut kullanın.

+0

Teşekkür ama u doğrudan + ve kullanabilirsiniz - "Özel Olaylar yönlendirildi" zaman ... Emin değilim. Bellek sızıntılarını önlemek için RegisterClassHandler'ı statik bir yapıcıya koyacağım. –

+0

Evet, Özel Yönlendirilmiş Etkinlikler için + ve - düğmelerini kullanabilirsiniz. Bunlar bir örnek düzeyinde kullanılır, ancak çözümünüzün sınıfın TÜM örneklerinin olaya abone olmasını istemesi nedeniyle EventManager.RegisterClassHandler gitmenin yoludur. Bununla birlikte, olaya kayıtlı olan yöntemin statik olması gerektiğini veya başka bir şeyle ilgilendiğiniz bellek sızıntısı sorununu alacağınızı da unutmamak gerekir. Bu bağlantıya bakın (http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/) – philt5252

İlgili konular