我以这种方式订阅活动:
s1.MouseUp += (s, e) =>
{
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
};
我怎么能在不同的范围内取消订阅? (但在s1
)范围内
我尝试了以下内容:
s1.MouseUp = null;
s1.MouseUp -=(s,e) =>
{
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
};
s1.MouseUp += (s,e) =>
{
//nothing
};
但事件还在解决,怎么办呢?
答案 0 :(得分:7)
不要使用匿名事件,而是使用命名事件。
s1.MouseUp += Mouse_Up;
s1.MouseUp -=Mouse_Up;
void Mouse_Up(object sender, MouseEventArgs ea)
{
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
}
答案 1 :(得分:5)
不要使用lambda来创建匿名事件处理程序。
s1.MouseUp += s1_MouseUp; //subscribe
s1.MouseUp -= s1_MouseUp; //ussubscribe
private void s1_MouseUp(object sender, MouseEventArgs e)
{
var s1 = (ListBox)sender; //cast it to proper object
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
}
答案 2 :(得分:3)
您必须确保取消订阅您订阅的相同处理程序,例如:
MouseEventHandler handler = (s, e) =>
{
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
};
s1.MouseUp += handler;
后来:
s1.MouseUp -= handler; // you must have kept a reference to this somewhere
当然,如果您打算这样做,那么首先简单地使用成员方法可能要容易得多,就像其他答案所暗示的那样。
答案 3 :(得分:1)
这不会取消订阅该事件,因为匿名方法无法保证编译成完全相同的东西,这会影响事件取消订阅的相等性检查,从而导致它们失败"删除订阅。
匿名方法与匿名类型不同,如果类型已存在,编译器将使用相同的类型定义。
使事件处理程序成为常规方法,或将匿名方法存储在局部变量中并取消订阅。
答案 4 :(得分:0)
如果你真的需要一个lambda(因为事件的执行上下文),你可以这样做:
var act = new Action<object, EventArgs>((e, s) =>
{
indexOfPointToMove = -1;
s1.LineStyle = LineStyle.Solid;
MyModel.RefreshPlot(false);
e.Handled = true;
});
this.MouseUp += act;
...
this.MouseUp -= act;