2011-10-23 28 views
6

Cách hủy đăng ký khỏi một sự kiện tùy chỉnh định tuyến.Sự kiện định tuyến tùy chỉnh WPF - Cách hủy đăng ký?

Tôi có đoạn code sau (rất chuẩn cho Custom Routed Sự kiện)

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

Bây giờ một lớp học sẽ đăng ký vào sự kiện này với dòng này:

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

Khi tôi đóng file ví dụ lớp, Tôi nên hủy đăng ký khỏi sự kiện (nếu không, bản sao sẽ không bị thu gom rác).

Tôi nên gọi gì? Tôi đã thử RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**) nhưng tôi nhận được ngoại lệ ...

Bất kỳ trợ giúp nào được chào đón. Cảm ơn trước.

JM

Trả lời

9

Bạn có thể sử dụng phương thức RemoveHandler từ lớp System.Windows.Window (thường là từ lớp UIElement).

Mã này có thể giống như thế này:

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

Cảm ơn rất nhiều vì câu trả lời nhanh. –

+0

Rất vui vì tôi đã có thể giúp bạn. –

5

Tôi không chắc chắn nếu tôi hoàn toàn hiểu những gì bạn đang làm, nhưng tôi sẽ ném vào hai xu của tôi.

EventManager.RegisterClassHandler cuộc gọi của bạn nên được đặt trong một constructor tĩnh cho lớp học của bạn, bạn muốn đăng ký. Điều này sẽ áp dụng cho tất cả các phiên bản của bạn và không ảnh hưởng đến việc thu gom rác thải.

Nếu bạn muốn thực hiện đăng ký/unregister sự kiện trên mỗi trường hợp cấp, sử dụng truyền thống

myEvent += myDelegate; 
myEvent -= myDelegate; 

Hope this helps.

+0

Cảm ơn cho câu trả lời nhưng u có thể trực tiếp sử dụng + và - khi họ đang "Custom Được gửi Sự kiện" ... Tôi không chắc chắn. Tôi sẽ đặt RegisterClassHandler trong một hàm tạo tĩnh để tránh rò rỉ bộ nhớ. –

+0

Có, bạn có thể sử dụng + và - cho các sự kiện định tuyến tùy chỉnh. Chúng được sử dụng trên một mức cá thể, tuy nhiên vì giải pháp của bạn dường như muốn tất cả các cá thể của lớp để đăng ký sự kiện, EventManager.RegisterClassHandler là cách để đi. Tuy nhiên nó cũng quan trọng cần lưu ý rằng phương pháp đã đăng ký cho sự kiện phải tĩnh hoặc nếu không bạn sẽ gặp phải vấn đề rò rỉ bộ nhớ mà bạn quan tâm. Xem [link] này (http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/) – philt5252

Các vấn đề liên quan