WPF自定义路由事件 - 如何取消订阅?

Jea*_*rie 6 wpf events routed

如何从一个自定义路由事件中取消注册.

我有以下代码(自定义路由事件非常标准)

//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
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,一个类将使用以下行来订阅此事件:

//Receive the Movement events
EventManager.RegisterClassHandler( 
      typeof(Window)
    , Main.MovementEvent
    , new Main.MovementRoutedEventHandler(MovementHandler));
Run Code Online (Sandbox Code Playgroud)

当我关闭类实例时,我应该从事件中取消订阅(否则,实例将不会被垃圾回收).

我该怎么称呼?我试过RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**)但我得到了一个例外......

欢迎任何帮助.提前致谢.

JM

Raf*_*jer 10

您可以使用System.Windows.Window类中的RemoveHandler方法(通常来自UIElement类).

代码看起来像这样:

Main.RemoveHandler( Main.MovementEvent
                  , new Main.MovementRoutedEventHandler(MovementHandler));
Run Code Online (Sandbox Code Playgroud)


phi*_*252 6

我不确定我是否完全明白你在做什么,但我会把两分钱扔进去.

您的EventManager.RegisterClassHandler调用应该放在您要注册的类的静态构造函数中.这将适用于您的所有类实例,不应影响垃圾回收.

如果您希望在每个实例级别上注册/取消注册该事件,请使用传统方法

myEvent += myDelegate;
myEvent -= myDelegate;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.