You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取UWP中InkCanvas的触摸输入数量?自定义手势需求

实现InkCanvas触摸数量判断的替代方案

嘿,这个需求完全可以实现!除了你提到的通过pointerId统计触摸数的方法,还有几种更直观的方式来跟踪InkCanvas上的活跃触摸输入数量,我来给你详细讲讲:

方法一:通过触摸事件维护活跃触摸集合

你可以利用InkCanvas的TouchDown、TouchUp和TouchLeave事件,维护一个存储当前活跃触摸设备ID的集合,通过集合的Count属性直接获取触摸数量。这种方式逻辑清晰,容易控制:

private HashSet<int> _activeTouchIds = new HashSet<int>();
private InkCanvas _inkCanvas;

public YourWindowConstructor()
{
    InitializeComponent();
    _inkCanvas = yourInkCanvasControl;
    // 绑定触摸事件
    _inkCanvas.TouchDown += InkCanvas_TouchDown;
    _inkCanvas.TouchUp += InkCanvas_TouchUp;
    _inkCanvas.TouchLeave += InkCanvas_TouchLeave;
}

private void InkCanvas_TouchDown(object sender, TouchEventArgs e)
{
    _activeTouchIds.Add(e.TouchDevice.Id);
    SwitchInteractionMode();
}

private void InkCanvas_TouchUp(object sender, TouchEventArgs e)
{
    _activeTouchIds.Remove(e.TouchDevice.Id);
    SwitchInteractionMode();
}

private void InkCanvas_TouchLeave(object sender, TouchEventArgs e)
{
    // 处理触摸点移出InkCanvas的情况
    _activeTouchIds.Remove(e.TouchDevice.Id);
    SwitchInteractionMode();
}

private void SwitchInteractionMode()
{
    switch (_activeTouchIds.Count)
    {
        case 1:
            // 单指触摸,启用绘图模式
            _inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
            break;
        case 2:
            // 双指触摸,切换到自定义手势模式
            _inkCanvas.EditingMode = InkCanvasEditingMode.None; // 禁用默认绘图避免冲突
            HandleCustomTwoFingerGesture(); // 你的自定义手势逻辑
            break;
        default:
            // 触摸数量为0或更多,可根据需求处理
            _inkCanvas.EditingMode = InkCanvasEditingMode.None;
            break;
    }
}

private void HandleCustomTwoFingerGesture()
{
    // 这里实现你的双指手势逻辑,比如缩放、平移等
}

方法二:直接查询活跃触摸设备

WPF的TouchDevice类提供了ActiveDevices静态属性,你可以过滤出当前直接作用于InkCanvas的触摸设备,从而得到触摸数量:

private int GetCurrentTouchCount()
{
    return TouchDevice.ActiveDevices.Count(touchDevice => 
        touchDevice.DirectlyOver == _inkCanvas);
}

你可以在需要判断的时机(比如TouchMove事件中)调用这个方法,来动态切换交互模式。不过要注意,这种方式需要每次查询所有活跃触摸设备,性能上比第一种维护集合的方式稍差一点,但对于大多数场景来说完全够用。

额外注意事项

  • 当触发双指手势时,记得先把InkCanvas的EditingMode设为None,避免默认的绘图逻辑和你的手势逻辑冲突。
  • 如果需要处理手势的连续动作(比如双指滑动),可以在TouchMove事件中结合触摸数量判断来执行对应逻辑。
  • 别忘了处理TouchLeave事件,防止触摸点移出InkCanvas后,集合里还残留无效的触摸ID。

总的来说,你的需求完全可以实现,以上两种方法都能很好地满足你的场景~

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:05:42