路由事件
为.net事件添加了一些基础的东西。是专门设计在元素树上的事件,当路由事件触发以后,它可能向上或向下遍历元素树,用一个简单而持久的方式在每个元素上触发,而不需要使用任何的定制代码。它和依赖属性有些相似。
路由事件的名称写法:RoutedEvent 而Event必须的。
路由事件也分3种传递方式:简称路由策略
路由策略:遍历整个元素树的方式,是由RoutingStrategy枚举提供
1, Tunneling管道传递:从根元素被触发,然后从每一个元素向下传递,直到到达源元素为止。(或者直接处理程序把事件记为己处理为止)。前缀为previe .一般在冒泡事件前被触发。
2, Bubbling 冒泡传递:事件首先在源元素被触发,然后沿着每一个元素向上传递,直达根元素为止。(或者直接处理程序把事件标记为己处理为止)
3, Direct 直接传递: 事件仅在源元素上触发。这事件会参与路由事件的特定机制,如事件触发器。
路由事件处理程序有一个签名,第一个参数System.Object sender
第二个参数是:System.EventArgs e
Sender负责传递给事件处理程序,就是被添加到的元素。
参数 e 是RoutedEventArgs的一个实例是EventArgs的一个子类,提供了4个属性。
E参数的4个属性:
1,Source : 逻辑树中一开始触发的事件元素。
2,OriginalSource : 可视树中一开始触发该事件的元素。
3,Handled : 布尔值,设置为true表示标记事件为己处理,这就是用于停止Tunneling或Bubbling的标记。
4, RoutedEvent : 真正的路由事件对象,当一个事件处理程序同时被多个路由事件时,它可以有效地识别被触发事件。
n 路由事件实现
Public class button:ButtonBase
{
//路由事件
Public static readonly RoutedEvent ClickEvent;
static Button()
{
//注册事件
Button.ClickEvent=EventManager.RegisterRoutedEvent
(“Click”,RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(Button));
}
//.net事件包装器(可选)
Public event RoutedEventHandler Click
{
Add{AddHandler(Button.ClickEvent,value);}
Remove{ RemoveHandler(Button.ClickEvent,value)}
}
Protected override void OnMouseLeftButtonDown(
MouseButtonEventArgs e
)
{
//触发事件
RaiseEvent(new RoutedEventArgs(button.ClickEvent,this));
}
}
包装器里的2个方法没有继承DependencyObject,而是继承了
System.windows.UIElement. 这些方法可以向路由事件添加或者移除委托。
有理解不对的地方,希望各位指教!谢过!