如何在WinUI 3/WPF C#中捕获触摸板双指双击事件
触摸板双指双击事件捕获方案(支持WinUI 3 & WPF)
核心问题说明
触摸板双指双击属于系统级手势,无法通过单纯的PointerPressed事件直接识别,需要借助专门的手势识别API,同时区分触摸板设备与鼠标操作。
WinUI 3 实现方案
步骤1:初始化手势识别器
在页面/控件的构造函数中创建GestureRecognizer,启用双指双击识别:
private readonly GestureRecognizer _gestureRecognizer; public MainPage() { InitializeComponent(); _gestureRecognizer = new GestureRecognizer(); // 启用双指双击手势检测 _gestureRecognizer.GestureSettings = GestureSettings.DoubleTap; _gestureRecognizer.DoubleTapped += OnTouchpadTwoFingerDoubleTap; }
步骤2:绑定按钮的指针事件
修改XAML,添加PointerMoved和PointerReleased事件(仅PointerPressed无法完整捕获手势):
<Button x:Name="Button" Background="Gray" Click="AddDevice_Click" Content="Tap" PointerPressed="Button_PointerPressed" PointerMoved="Button_PointerMoved" PointerReleased="Button_PointerReleased" RightTapped="AddTetsDeviceButton_RightTapped"/>
步骤3:处理指针事件并传递给手势识别器
在后台代码中处理指针事件,过滤触摸板设备并检查双指接触:
private void Button_PointerPressed(object sender, PointerRoutedEventArgs e) { var pointerPoint = e.GetCurrentPoint(Button); // 仅处理触摸板设备的双指按压 if (pointerPoint.PointerDeviceType == PointerDeviceType.TouchPad && pointerPoint.Properties.ContactCount == 2) { _gestureRecognizer.ProcessDownEvent(pointerPoint); e.Handled = true; } // 保留鼠标右键检测逻辑 else if (pointerPoint.PointerDeviceType == PointerDeviceType.Mouse && pointerPoint.Properties.IsRightButtonPressed) { Debug.WriteLine("Mouse right click detected"); e.Handled = true; } } private void Button_PointerMoved(object sender, PointerRoutedEventArgs e) { var pointerPoints = e.GetIntermediatePoints(Button); if (pointerPoints.Any(p => p.PointerDeviceType == PointerDeviceType.TouchPad)) { _gestureRecognizer.ProcessMoveEvents(pointerPoints); } } private void Button_PointerReleased(object sender, PointerRoutedEventArgs e) { var pointerPoint = e.GetCurrentPoint(Button); if (pointerPoint.PointerDeviceType == PointerDeviceType.TouchPad) { _gestureRecognizer.ProcessUpEvent(pointerPoint); _gestureRecognizer.CompleteGesture(); e.Handled = true; } } // 双指双击触发的业务逻辑(无障碍朗读) private void OnTouchpadTwoFingerDoubleTap(GestureRecognizer sender, DoubleTappedEventArgs args) { Debug.WriteLine("Touchpad two-finger double tap detected"); // 执行朗读操作 }
WPF 实现方案
WPF没有原生的触摸板手势识别器,可通过StylusDevice结合DoubleTapped事件实现检测:
步骤1:修改按钮XAML
启用操作识别并绑定DoubleTapped事件:
<Button x:Name="Button" Background="Gray" Click="AddDevice_Click" Content="Tap" DoubleTapped="Button_DoubleTapped" RightTapped="AddTetsDeviceButton_RightTapped" IsManipulationEnabled="True"/>
步骤2:处理双指双击事件
在后台代码中判断触摸板设备及双指接触数量:
private void Button_DoubleTapped(object sender, MouseButtonEventArgs e) { // 验证是否为触摸板设备且存在双指接触 if (e.StylusDevice != null && e.StylusDevice.TabletDevice.Type == TabletDeviceType.TouchPad) { var touchPoints = e.StylusDevice.GetStylusPoints(Button); if (touchPoints.Count == 2) { Debug.WriteLine("Touchpad two-finger double tap detected"); // 执行朗读操作 e.Handled = true; return; } } // 其他双击逻辑(若需要) } // 鼠标右键检测逻辑 private void AddTetsDeviceButton_RightTapped(object sender, MouseButtonEventArgs e) { Debug.WriteLine("Mouse right click detected"); e.Handled = true; }
若需更高精度,WPF可通过WinRT互操作调用
GestureRecognizer,实现与WinUI3一致的逻辑,需在项目中启用WinRT支持。
全局检测(光标在其他位置时)
若要在整个应用窗口内捕获触摸板双指双击,只需将上述事件绑定到窗口级元素(如WinUI3的Window、WPF的Window或Grid容器),而非单个按钮。这样无论光标位于窗口内哪个位置,均可检测到手势。
内容的提问来源于stack exchange,提问作者Mahfuz




