WPF Custom Routed Events - Как отписаться от рассылки? - PullRequest
6 голосов
/ 23 октября 2011

Как отменить регистрацию от одного пользовательского перенаправленного события.

У меня есть следующий код (очень стандартный для пользовательских перенаправленных событий)

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

Теперь класс подпишется на это событие с этимстрока:

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

Когда я закрываю экземпляр класса, я должен отменить подписку на событие (в противном случае экземпляр не будет собирать мусор).

Что мне вызвать?Я пытался RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**), но получаю исключение ...

Любая помощь приветствуется.Заранее спасибо.

JM

Ответы [ 2 ]

10 голосов
/ 24 октября 2011

Вы можете использовать RemoveHandler метод из класса System.Windows.Window (обычно из класса UIElement).

Код может выглядеть примерно так:

Main.RemoveHandler( Main.MovementEvent
                  , new Main.MovementRoutedEventHandler(MovementHandler));
6 голосов
/ 24 октября 2011

Я не уверен, что полностью понимаю, что вы делаете, но я добавлю два цента.

Ваш вызов EventManager.RegisterClassHandler должен быть помещен в статический конструктор для вашего класса, который вы хотите зарегистрировать. Это будет применяться ко всем вашим экземплярам класса и не должно влиять на сборку мусора.

Если вы хотите зарегистрировать / отменить регистрацию события на уровне экземпляра, используйте традиционный

myEvent += myDelegate;
myEvent -= myDelegate;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...