1

重複の可能性:
C# の匿名メソッドのサブスクライブを解除する
シングルショット イベント サブスクリプション

イベントハンドラー自体からイベントハンドラーへの参照を取得して、それを呼び出したイベントからフックを解除することはできますか?

たとえば、control.Loaded イベントが Lambda を指すようにしたいのですが、そうした場合、unhook (-=) 呼び出しに何を渡せばよいかわかりません。

コードの抜粋を次に示します。

private static void IsEnabled_Changed(object sender, DependencyPropertyChangedEventArgs e)
{
    var control = (Control)sender;

    if(control.IsLoaded)
        WireUpScrollViewerEvents(control);
    else
        control.Loaded += Control_Loaded;

}

private static void Control_Loaded(object sender, RoutedEventArgs e)
{
    var control = (Control)sender;

    control.Loaded -= Control_Loaded; // <-- How can I do this from a lambda in IsEnabled_Changed?

    WireUpScrollViewerEvents(control);
}

private static void WireUpScrollViewerEvents(Control control, bool attach)
{
    var scrollViewer = Utils.FindFirstVisualChild<ScrollViewer>(control);
    if(scrollViewer == null) return;

    var attachEvents = GetIsEnabled(control);

    if(attachEvents)
    {
        scrollViewer.PreviewDragEnter += ScrollViewer_PreviewDragEnter;
        scrollViewer.PreviewDragOver  += PreviewDragOver;
    }
    else
    {
        scrollViewer.PreviewDragEnter -= ScrollViewer_PreviewDragEnter;
        scrollViewer.PreviewDragOver  -= PreviewDragOver;
    }
}

Control_Loaded が実際のメソッドである唯一の理由は、「control.Loaded -= Control_Loaded」行のためです。IsEnabled_Changed 呼び出し内から直接匿名ラムダを実行できるかどうか疑問に思っています。

4

1 に答える 1

2

わかりました、見つけました。

わかりました、見つけました。私がそれを機能させることができなかった理由は、私がこれをしていたからです...

RoutedEventHandler Control_Loaded = (s2, e2) =>
{
    control.Loaded -= Control_Loaded;
    WireUpScrollViewerEvents(control);
};

...いつこれをやるべきだったのか...

RoutedEventHandler Control_Loaded = null; // <-- It's now declared before it's set, which is what we need
Control_Loaded = (s2, e2) =>
{
    control.Loaded -= Control_Loaded;
    WireUpScrollViewerEvents(control);
};

これは、変数を使用する前に実際に変数を宣言する必要があり、宣言の一部として使用しようとしたためです。これはそれを修正します。

于 2012-09-13T18:23:18.403 に答える