在控件中定义冒泡的事件
如果希望控件为它所定义的事件冒泡,控件只要从引发该事件的OnEventName方法调用RaiseBubbleEvent.
示例:定义一个启用冒泡的Command事件
protected virtual void OnCommand(CommandEventArgs e)
{
CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];
if(handler != null)
handler(this,e);
RaiseBubbleEvent(this,e);
}
注意:事件冒泡并不限于命令事件。可以使用此机制使任何事件冒泡
控件对冒泡事件的处理
1.如果不重写OnBubbleEvent,事件会自动冒泡到上级.
2.重写OnBubbleEvent,并从OnBubbleevent调用RaiseBubleEvent,控件进行一些处理并继续使事件冒泡.
示例:在检查事件参数的类型后使事件冒泡
protected override bool OnBubbleEvent(object source,EventArgs e)
{
if(e is CommandEventArgs)
{
TemplatedListCommandEventArgs args = new TemplatedListCommandEventArgs(this,source,(CommandEventArgs)e);
RaiseBubbleEvent(this,args);
return true;
}
return false;
}
3.重写OnBubbleEvent 以调用引发此冒泡的事件的OnEventName方法.引发冒泡的事件的控件(够绕的)通常将冒泡的事件公开为顶级事件.
注意:在 .NET Framework中 OnEventName方法的标准签名有一个参数(protected void OnEventName (EventArgs e))。但是,OnBubbleEvent有两个参数,因为该事件并不是在处理事件的控件中定义(起源)的,而是起源于控件之外;它的第二个参数的作用是提供源。