You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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,添加PointerMovedPointerReleased事件(仅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的WindowGrid容器),而非单个按钮。这样无论光标位于窗口内哪个位置,均可检测到手势。


内容的提问来源于stack exchange,提问作者Mahfuz

火山引擎 最新活动