从匿名委托事件退订(Unsubscribing from anonymous delegate ev

2019-09-17 21:08发布

我有一些麻烦,首先要弄清楚的是我在一个预先制作的辅助文件,帮助允许在运行时间中的移动发现了一些匿名委托事件退订的方法。 我想取消这些事件的原因是,这样的控制(在这种情况下按钮),将再次成为且未被锁定能够移动。 这里是辅助类中的方法:

 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上的一些方法有关创建一个局部变量持有这些事件,然后通过这样的方式退订退订这些,但我似乎无法在我自己的项目得到这个工作。 我如何去退订这些事件使我的控制再次成为固定的位置?

Answer 1:

由编译器生成的匿名委托不能保证是唯一的,这退订缺乏同一代码的唯一性时会导致失败退订正确的处理程序。 如此做安全的唯一方法就是保持到委托的引用,并用它来退订,或者将其更改为一个完整的方法。

代表们根据对象实例和方法签名,我相信是相等的。

可能重复:

如何删除一个lambda事件处理程序

基本上,保持一个参考:

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

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

或关闭匿名方法到合适的方法。



Answer 2:

总之,你不能做到这一点与anonymous委托。

如果你想有一个abbilty从事件退订 ,定义一个delegate/action ,并按照你参考的模式。



文章来源: Unsubscribing from anonymous delegate event