功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent) 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
路由事件使用
定义路由事件
public class CustomButton : Button
{
// 路由事件的名称
public const string CustomerClikcEvent = "CustomerClikcEvent";
// 注册路由事件
public static readonly RoutedEvent CutmoerClickEvent
= EventManager.RegisterRoutedEvent(
CustomerClikcEvent, // 路由事件名称
RoutingStrategy.Bubble, // 路由事件类型
typeof(RoutedEventHandler), // 处理时间的类型
typeof(CustomButton)// 处理事件
);
// 路由事件的包装器
public event RoutedEventHandler CustomerClick
{
add { this.AddHandler(CutmoerClickEvent, value); }
remove { this.RemoveHandler(CutmoerClickEvent, value); }
}
}
处理路由事件
// xaml代码绑定
<local:CustomButton Content="123" CustomerClick="CustomButton_CustomerClick" MaxWidth="120" x:Name="btnCus" MaxHeight="50" Click="CustomButton_Click"></local:CustomButton>
// C#代码绑定
btnCus.CustomerClick += BtnCus_CustomerClick;
// 事件处理的详细按钮
private void CustomButton_CustomerClick(object sender, RoutedEventArgs e)
{
var logicTreeItem = (e.Source as UIElement).GetType();// 只到页面逻辑课看到的数据
var viualTreeItem = (e.OriginalSource as UIElement).GetType();// 代表可以看到更控件的细节
e.Handled = true;// 已经被处理,提供给后续事件,如果该事件已经被处理可以不再处理
MessageBox.Show("CusmtomerCLick");
}
引发路由事件
btnCus.RaiseEvent(new RoutedEventArgs(CustomButton.CutmoerClickEvent));// 制定要引发的路由事件,而非传统的事件触发机制
路由事件的种类
- 冒泡Bubbles路由事件
- 事件由激发者触发,一层一层向VisualTree的树根传递,直到Window或Page类
- 一般的MouseDown等事件为,冒泡事件
注意一般情况下button按钮的mousedown事件是不会触发的,因为Click事件已经处理了该事件,如果要触发则需要手动注册事件,并设置处理事件的标识为True
btnInvokeBubble.AddHandler(Button.MouseLeftButtonDownEvent, new RoutedEventHandler((obj,e)=> { e.Handled = false; lstBublle.Items.Add(obj.GetType().ToString()); }),handledEventsToo: true);
Tunnel路由事件
- 与冒泡路由事件向非,是由树根(Window或Page)向控件进行传递
- 一般的PreviexxxxEvent为隧道事件
- Direct路由事件
- 等同于CLR事件,直接触发,不会进行传递例如:Click事件
附加路由事件
附加事件的成因是因为某些事件定义到了非UIElelement类的元素上,无法调用自带的AddHandler类来添加,则只能手动添加以下代码,以方便将该事件附加到对应的UIElelemnt元素上。// 制定要引发的路由事件,而非传统的事件触发机制
btnCus.RaiseEvent(new RoutedEventArgs(CustomButton.CutmoerClickEvent));