4

実行時にコントロールを移動できるようにするために作成済みのヘルパーファイルで見つけた匿名のデリゲートイベントからサブスクライブを解除する方法を見つけるのに問題があります。これらのイベントの購読を解除したい理由は、コントロール(この場合はボタン)が再びロックされ、移動できなくなるためです。ヘルパークラスのメソッドは次のとおりです。

 public static void Init(Control control)
    {
        Init(control, Direction.Any);
    }

    public static void Init(Control control, Direction direction)
    {
        Init(control, control, direction);
    }

 public static void Init(Control control, Control container, Direction direction)
    {
        bool Dragging = false;
        Point DragStart = Point.Empty;

        control.MouseDown += delegate(object sender, MouseEventArgs e)
        {
            Dragging = true;
            DragStart = new Point(e.X, e.Y);
            control.Capture = true;
        };
        control.MouseUp += delegate(object sender, MouseEventArgs e)
        {
            Dragging = false;
            control.Capture = false;
        };
        control.MouseMove += delegate(object sender, MouseEventArgs e)
        {
            if (Dragging)
            {
                if (direction != Direction.Vertical)
                    container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
                if (direction != Direction.Horizontal)
                    container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
            }
        };

    }

メソッドを呼び出してこれらのイベントをサブスクライブする方法は次のとおりです。

    ControlMover.Init(this.Controls["btn" + i]);

これらのイベントを保持するローカル変数を作成し、この方法でサブスクライブを解除することで、これらのサブスクライブを解除する方法について、MSDNでいくつか読んだことがありますが、自分のプロジェクトでこれを機能させることができないようです。これらのイベントの購読を解除して、コントロールが再び所定の位置に固定されるようにするにはどうすればよいですか?

4

2 に答える 2

9

匿名デリゲートは、コンパイラによって作成されたとおりに一意であることが保証されていません。同じコードのこの一意性の欠如が原因で、正しいハンドラーのサブスクライブ解除に失敗する場合です。これを安全に行う唯一の方法は、デリゲートへの参照を保持し、それを使用してサブスクライブを解除するか、完全なメソッドに変更することです。

デリゲートは、私が信じているオブジェクト インスタンスとメソッド シグネチャに基づいて同等です。

可能な重複:

ラムダ イベント ハンドラーを削除する方法

基本的に、参照を保持します。

MouseEventHandler handler = (sender, e) =>
        {
            Dragging = true;
            DragStart = new Point(e.X, e.Y);
            control.Capture = true;
        };

control.MouseDown += handler;
control.MouseDown -= handler;

または、匿名メソッドを適切なメソッドに変更します。

于 2012-06-07T14:00:27.797 に答える
1

つまり、anonymousデリゲートではそれを行うことはできません。

イベントから退会する能力が必要な場合は、を定義し、delegate/action参照するパターンに従います。

于 2012-06-07T13:59:13.630 に答える