取消匿名委托事件
我在解决某些匿名委托事件方面遇到了一些麻烦,这些事件在预先制作的帮助文件中发现,有助于在运行时移动控件。 我想取消订阅这些事件的原因是,控件(在本例中为按钮)将再次被锁定,无法移动。 以下是助手类中的方法:
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上的一些方法,通过创建一个包含这些事件的局部变量来取消订阅,然后通过这种方式取消订阅,但我似乎无法在我自己的项目中获得此工作。 我该如何解除这些事件,以便我的控件再次固定到位?
如果取消订阅相同代码的唯一性缺乏将导致它无法取消订阅正确的处理程序,匿名代理并不保证是由编译器创建的唯一。 唯一安全的做法是保留对委托的引用并使用它来取消订阅,或者将其更改为完整的方法。
我相信代表基于对象实例和方法签名是平等的。
可能的重复:
如何删除一个lambda事件处理程序
基本上,保留一个参考:
MouseEventHandler handler = (sender, e) =>
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
};
control.MouseDown += handler;
control.MouseDown -= handler;
或者将匿名方法转换为适当的方法。
总之,你不能用anonymous
代理来做到这一点。
如果您想取消订阅该活动,请定义一个delegate/action
并按照您引用的模式进行delegate/action
。