6

1 つのカスタム ルーティング イベントから登録解除する方法。

次のコードがあります (カスタム ルーティング イベントでは非常に標準的です)。

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

クラス インスタンスを閉じるときは、イベントから UnSubscribe する必要があります (そうしないと、インスタンスはガベージ コレクションされません)。

何と呼べばいいですか?試しRegisterClassHandler(typeof(Window), Main.MovementEvent, **null**)ましたが、例外が発生しました...

どんな助けでも大歓迎です。前もって感謝します。

JM

4

2 に答える 2

10

System.Windows.Window クラス (通常は UIElement クラス) からRemoveHandlerメソッドを使用できます。

コードは次のようになります。

Main.RemoveHandler( Main.MovementEvent
                  , new Main.MovementRoutedEventHandler(MovementHandler));
于 2011-10-23T21:05:38.483 に答える
6

あなたが何をしているのか完全に理解しているかどうかはわかりませんが、2 セントを投じます。

EventManager.RegisterClassHandler 呼び出しは、登録するクラスの静的コンストラクターに配置する必要があります。これはクラスのすべてのインスタンスに適用され、ガベージ コレクションには影響しません。

インスタンスごとにイベントへの登録/登録解除を行いたい場合は、従来の

myEvent += myDelegate;
myEvent -= myDelegate;

お役に立てれば。

于 2011-10-23T20:50:35.100 に答える