Avalonia 通过 GestureRecognizer 基于指针事件统一实现跨平台手势识别,支持 Tap、LongPress、Swipe、Pinch 等内置识别器,需手动添加至控件集合,事件可冒泡且不默认阻断指针事件,移动端需注意系统手势冲突与视觉反馈同步。

Avalonia 通过 GestureRecognizer(手势识别器) 处理触摸屏手势,核心机制是监听底层指针事件(如 PointerPressed/PointerMoved/PointerReleased),再在控件内部识别出滑动、长按、双击等抽象手势行为。它不依赖系统原生手势 API,而是基于统一的指针事件流做逻辑判断,因此在 Windows、macOS、Linux、iOS 和 Android 上表现一致。
手势识别器的使用方式
手势识别器需显式添加到控件的 GestureRecognizers 集合中,而非通过 XAML 属性自动绑定:
- 在 C# 中添加(推荐):
myButton.GestureRecognizers.Add(new TapGestureRecognizer()); - 支持链式添加多个识别器:
myPanel.GestureRecognizers.AddRange(new IGestureRecognizer[] { new SwipeGestureRecognizer(), new LongPressGestureRecognizer() }); - 识别器会自动监听所属控件接收到的所有指针事件,无需手动订阅 PointerXXX 事件
常用内置手势识别器
Avalonia 提供了开箱即用的手势识别器类型(位于 Avalonia.Controls.Gestures 命名空间):
- TapGestureRecognizer:单点快速触按(类似 Click,但更轻量、可定制阈值)
- LongPressGestureRecognizer:按住超过指定毫秒数触发(常用于弹出上下文菜单)
- SwipeGestureRecognizer:识别水平或垂直方向滑动,可设置最小位移和最大耗时
- PinchGestureRecognizer:支持缩放手势(需配合多点触控设备)
- 自定义识别器可继承
GestureRecognizer并重写OnPointerPressed/OnPointerMoved等方法
事件触发与交互协同
手势事件默认不阻断原生指针事件,但可通过 e.Handled = true 控制事件流:
- 手势识别成功后会触发
GestureEvent(如Tapped、Swiped),该事件采用冒泡路由策略 - 若同时注册了
PointerPressed和Tapped,且TapGestureRecognizer先触发并设e.Handled = true,则后续PointerPressed不会被调用 - 按钮类控件(如 Button)默认已内置点击逻辑,若需手势增强(如长按+点击区分),建议禁用默认行为:
ClickMode="Release"+ 手动添加LongPressGestureRecognizer
iOS/Android 平台特别注意
移动端需额外适配安全区域与系统手势冲突问题:
- iOS 上系统级滑动手势(如返回)可能拦截部分 Swipe 事件,建议在
TopLevel设置IgnoreSystemGestures = true(仅限特定区域) - Android 的
ViewRootImpl可能吞掉快速连续事件,Avalonia 11+ 已优化指针事件分发延迟,建议升级至最新稳定版 - 所有手势识别器在移动端均工作正常,但视觉反馈(如按钮按下态)需配合
IsPressed属性或伪类(:pressed)同步更新










