我遇到了事件的问题。例如,让我有事件
public event EventHandler<AxisChangedEventArgs> AxisChanged
当Axis平移或缩放或其他东西时会触发。当它开火时我正在制作Console.WriteLine("Working");
。如何将CFDBOX
参数传递给SomeWork
匿名方法无济于事,因为取消订阅它是不可能的。我无法覆盖AxisChanged
事件。
public void AddEvents(CFDBOX CFDBOX) {
CFDBOX.PlotModel.Axes[0].AxisChanged += SomeWork;
}
public void RemoveEvents(CFDBOX CFDBOX) {
CFDBOX.PlotModel.Axes[0].AxisChanged -= SomeWork;
}
public EventHandler<AxisChangedEventArgs> SomeWork =
delegate(object o, AxisChangedEventArgs args) {
Console.WriteLine("Working");
}
;
答案 0 :(得分:1)
利用closure lambda表达式:
private EventHandler<AxisChangedEventArgs> axisChangedEventHandler;
public void AddEvent(CFDBOX CFDBOX) {
// keep a reference of the event handler to remove it later
axisChangedEventHandler = (o, args) => {
// parameter CFDBOX bound to the event handler
Console.WriteLine("Working " + CFDBOX);
};
// register event handler
CFDBOX.PlotModel.Axes[0].AxisChanged += axisChangedEventHandler;
}
public void RemoveEvent() {
// unregister event handler
CFDBOX.PlotModel.Axes[0].AxisChanged -= axisChangedEventHandler;
}
答案 1 :(得分:0)
任何必须与event
一起传递的参数都应该是EventArgs
实施的成员。在您的方案中:AxisChangedEventArgs
。希望我能得到你的问题。
事件的发件人(在您的情况下为o
)应该始终是调用事件的实例。因此,如果您的事件被不同的类(而不是实例!)触发,您将必须检查o
的类型。