我们都知道路由事件,而附加事件用的比较少。

但如果是通用的场景,类似附加属性,附加事件就很有必要的。

举个例子,输入设备有很多种,WPF中输入事件主要分为鼠标、触摸、触笔:WPF 屏幕点击的设备类型 - 唐宋元明清2188 - 博客园 (cnblogs.com)

有这么多输入事件Mouse、Touch、Stylus,另外按钮Click还处理了冒泡事件,事件类型就更多了。

但绝大部分业务其实并不关心事件类型,只需要一个触发事件就行了。

所以我们有这样的需求:设计并提供一个通用的输入事件,大家只需要拿到事件进行业务操作。另外一些小场景,如果需要具体事件如触摸点集,可以从事件源参数内部去获取。

具体的通用输入事件,我们另外讨论,这里主要描述如何自定义附加事件

附加事件

WPF官方对附加事件的描述 - 附加事件概述 - WPF .NET Framework | Microsoft Learn

所以我们先定义一个附加事件类:

 1     public class DeviceEvents
 2     {
 3         /// <summary>
 4         /// 按压事件
 5         /// </summary>
 6         public static readonly RoutedEvent PreviewDeviceDownEvent = EventManager.RegisterRoutedEvent("PreviewDeviceDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(DeviceEvents));
 7         public static void AddPreviewDeviceDownHandler(DependencyObject d, RoutedEventHandler handler)
 8         {
 9             (d as UIElement)?.AddHandler(DeviceEvents.PreviewDeviceDownEvent, handler);
10         }
11         public static void RemovePreviewDeviceDownHandler(DependencyObject d, RoutedEventHandler handler)
12         {
13             (d as UIElement)?.RemoveHandler(DeviceEvents.PreviewDeviceDownEvent, handler);
14         }
15     }
12-29 14:50