首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF自定义路由事件-如何UnSubscribe?

WPF自定义路由事件-如何UnSubscribe?
EN

Stack Overflow用户
提问于 2011-10-23 21:39:19
回答 2查看 4.2K关注 0票数 6

如何从一个自定义路由事件执行DeRegister。

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

代码语言:javascript
复制
//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
    });
}

现在,一个类将使用下面的代码行订阅此事件:

代码语言:javascript
复制
//Receive the Movement events
EventManager.RegisterClassHandler( 
      typeof(Window)
    , Main.MovementEvent
    , new Main.MovementRoutedEventHandler(MovementHandler));

当我关闭类实例时,我应该从事件中执行UnSubscribe (否则,实例将不会被垃圾回收)。

我应该打什么电话?我尝试过RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**),但我得到了一个异常...

欢迎任何帮助。提前谢谢。

JM

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 05:05:38

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

代码可能如下所示:

代码语言:javascript
复制
Main.RemoveHandler( Main.MovementEvent
                  , new Main.MovementRoutedEventHandler(MovementHandler));
票数 10
EN

Stack Overflow用户

发布于 2011-10-24 04:50:35

我不确定我是否完全明白你在做什么,但我会提出我的意见。

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

如果希望在每个实例级别上注册/注销事件,请使用传统的

代码语言:javascript
复制
myEvent += myDelegate;
myEvent -= myDelegate;

希望这能有所帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7866458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档