WPF中的事件类型RoutedEvent是一种可以延逻辑树LogicalTree进行传递的冒泡式的事件类型,如何充分利用这种特性呢?举个例子,在元素A下有元素B下有元素C,C下有事件被激发了,那么肯定会冒泡传递到B再到A,那么在A上面可以直接写EventHandler来得到C的事件,具体方法如下:
用户控件最底层UCButton.cs

定义事件...myEvent...(略)
public static readonly System.Windows.RoutedEvent myEvent = EventManager.RegisterRoutedEvent("my", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UCButton));
...

//构造中给自己的my事件加上响应
public UCButton()
{
this.InitializeComponent();
this.my += new RoutedEventHandler(UCButton_my);
}
void UCButton_my(object sender, RoutedEventArgs e)
{
      Console.WriteLine("按钮:事件响应Sender:" + sender.GetType().Name);
}
//在UCButton中,鼠标左键按下时同时Raise这个事件
protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
            base.OnMouseLeftButtonDown(e);
            RaiseMyEvent();
}


将UCButton,用XAML的形式放进另一个控件,MidLayer.xaml中,MidLayer.xaml.cs中有如下事件监听写法

public MidLayer()
{
this.InitializeComponent();
this.AddHandler(UCButton.myEvent, new RoutedEventHandler(MyEvent));
}
void MyEvent(object sender, RoutedEventArgs e)
{
Console.WriteLine("中间层:事件响应Sender:" + sender.GetType().Name);
}


最后将MidLayer放到Window1.xaml中,也在Window1.xaml.cs中写上与midlayer同样的事件监听,代码略,那么,运行后,鼠标点击到UCButton时,输出如下:

按钮:事件响应Sender:UCButton
中间层:事件响应Sender:MidLayer
窗口:事件响应Sender:Window1
还记得RoutingStrategy.Bubble吗?现在是冒泡式的,也就是从下往上,先响应按钮,最后是外层,可以改一下,改成RoutingStrategy.Tunnel,这时候输出顺序就变了:

窗口:事件响应Sender:Window1
中间层:事件响应Sender:MidLayer
按钮:事件响应Sender:UCButton

还有最后一种,改成RoutingStrategy.Direct,这时候就只有一个输出了,只直接将事件发给自己

按钮:事件响应Sender:UCButton

三种RoutedEvent策略,三种应用方案,那么我们至少可以在顶层捕捉到下面的事件了