MAUI 的 SwipeView 是实现侧滑菜单(比如左滑删、右滑标记)最直接的控件,它不依赖第三方库,原生支持 iOS、Android 和 Windows(触控模式),用法清晰但有几个关键点容易踩坑。
基础结构:内容 + 轻扫项
SwipeView 本质是一个“包装器”——它包裹一个主内容(如 Label、StackLayout),再通过 LeftItems/RightItems/TopItems/BottomItems 添加可触发的菜单项。Content 属性是隐式内容属性,不用写
Content=标签。 只允许一个直接子元素作为 Content(如不能直接放多个 Label,需用 StackLayout 包一层) 每个方向最多一组 SwipeItems,每组可含多个 SwipeItem(例如右滑弹出“标记”和“归档”两个按钮) SwipeItem 支持 Text、IconImageSource、BackgroundColor、Command/CommandParameter,还能响应 Invoked 事件
平台行为差异必须注意
SwipeView 在不同系统上默认交互逻辑不同,尤其 Windows 只响应触控,鼠标拖拽无效;iOS 和 Android 还提供两种展开动画模式:
Reveal(默认):轻扫时内容不动,菜单项像“帘子”一样从边缘渐显 Drag:轻扫时整个内容区域被拖动,菜单项随动滑入(更接近原生 iOS 邮件体验) XAML 中启用 Drag 模式需加平台特定命名空间,例如 iOS:ios:SwipeView.SwipeTransitionMode="Drag"C# 中调用:
swipeView.On<ios>().SetSwipeTransitionMode(SwipeTransitionMode.Drag)</ios>
常用交互控制技巧
除了用户手动滑动,你还可以用代码控制开关状态或监听过程:
调用swipeView.Open(OpenSwipeItem.Left)或
.Close()主动展开/收起 监听
SwipeStarted、
SwipeChanging、
SwipeEnded三个事件,其中 SwipeEndedEventArgs 提供
IsOpen(是否最终打开了)和
SwipeDirection设置
Threshold属性(double 类型)可调整触发完全展开所需的滑动距离,默认约 0.5,值越小越灵敏 若想禁止某个方向滑动,直接不定义对应 Items(比如没设 RightItems,就无法右滑)
实际小例子:左滑删除条目
在 ListView 或 CollectionView 的 DataTemplate 中嵌入 SwipeView,是最典型场景:
<SwipeView>
<SwipeView.LeftItems>
<SwipeItems>
<SwipeItem Text="删除"
IconImageSource="delete.png"
BackgroundColor="Red"
Invoked="OnDeleteInvoked"/>
</SwipeItems>
</SwipeView.LeftItems>
<Label Text="{Binding Title}" VerticalOptions="Center" />
</SwipeView>后台 C# 中处理删除逻辑即可,注意 Invoked 事件里可通过
sender或绑定上下文获取当前数据项。
基本上就这些。用好 SwipeView 不复杂,但得记清平台限制、动画模式选择和事件触发时机——特别是别在 Windows 上指望鼠标拖拽生效。
