汤姆弗雷是对的。如果您希望某个事件的行为由通常会触发该事件的类处理,则首选技术是覆盖触发该事件以执行您的任务的适当方法。赛事基础设施是矫枉过正的,并不是真正为您在这里尝试做的事情而设计的。
原因是您希望视图的每个实例都执行这些操作。您不希望这些操作在运行时由视图外部的事物动态分配和确定(这就是事件的用途)。
但是,在执行此类覆盖时要包括的一件重要事情是对基实现的调用。如果不这样做,您可能会遇到奇怪的错误:
protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
{
// Do stuff you want done before here
base.OnNodeMouseClick(e);
// Do stuff you want done after here
}
调用基类将触发事件并可能执行其他操作。如果您想在事件触发之前完成某些事情并且任何外部订阅者都做他们的事情,请将其放在调用基地之前。如果你想在所有事件都被触发并被处理后完成一些事情,把它放在后面。人为的例子:如果您的控件处理了一些数据绑定,那么您可能希望在调用 base 之前验证数据绑定是否存在,并且您可能希望在之后验证它是否有效(以防处理程序修改某些内容)。
来自MSDN:
该OnNodeMouseClick
方法还允许派生类在不附加委托的情况下处理事件。
这是在派生类中处理事件的首选技术。
继承人注意事项:
在派生类中重写OnNodeMouseClick
时,请务必调用基类的OnNodeMouseClick
方法,以便注册的委托接收事件。