XAML事件(WPF的路由事件(冒泡事件、隧道事件(预览事件)){2}
作者:陈钰桃
撰写时间:2022年1月17日
示例
1.在 Windows Presentation Foundation (WPF) 中,元素以元素树结构形式排列。 父元素可以参与处理最初由元素树中的子元素引发的事件。 这都是因为事件路由。
2.路由事件通常遵循以下两个路由策略之一:浮升(冒泡)和隧道。 此示例重点介绍浮升事件,并使用ButtonBase.Click事件可显示路由的工作原理。
3.下面的示例创建两个Button控制,并使用XAML特性语法将事件处理程序附加到公用父元素,它在此示例中为StackPanel。而不是将单个事件处理程序附加每个Button子元素,该示例使用特性语法将附加到的事件处理程序StackPanel父元素。此事件处理模式展示了如何使用事件路由技术来减少附加处理程序的元素数。 每个的所有浮升事件Button通过父元素路由。
4.请注意,在父StackPanel元素中,Click指定为该属性进行部分限定的命名的事件名称Button类。Button类是ButtonBase派生的类具有Click事件在其成员列表中的。如果要处理的事件不在附加路由事件处理程序的元素的成员列表中,则有必要使用这种部分限定技术来附加事件处理程序。
文件案例代码及效果图
下面的示例处理Click事件。 该示例会报告哪个元素处理事件以及哪个元素引发事件。 用户单击任一按钮时都将执行事件处理程序。
C#代码
1 using System.Text;
2 using System.Windows;
3
4 namespace WpfApplication5
5 {
6 /// < summary>
7 /// MainWindow.xaml 的交互逻辑
8 /// < /summary>
9 public partial class MainWindow : Window
10 {
11 public MainWindow()
12 {
13 InitializeComponent();
14 }
15 //声明 builder 是 StringBuilder 类/类型,new StringBuilder(); 是
初始化/构建/分配单元。
16 StringBuilder eventstr = new StringBuilder();
17 //事件
18 void HandleClick(object sender, RoutedEventArgs args)
19 {
20 // 获取处理该事件的元素。
21 FrameworkElement fe = (FrameworkElement)sender;
22 eventstr.Append(“元素处理的事件”);
23 eventstr.Append(fe.Name);
24 eventstr.Append("\n");
25
26 //获取引发事件的元素。
27 FrameworkElement fe2 = (FrameworkElement)args.Source;
28 eventstr.Append(“事件起源于类型的源元素 “);
eventstr.Append(args.Source.GetType().ToString());29 eventstr.Append(” with Name “);
30 eventstr.Append(fe2.Name);
31 eventstr.Append(”\n”);
32
33 // 获取路由策略。
34 eventstr.Append(“事件使用路由策略 “);
35 eventstr.Append(args.RoutedEvent.RoutingStrategy);
36 eventstr.Append(”\n”);
37
38 results.Text = eventstr.ToString();
}
}
}