如何为UWP应用的ListView绑定PointerReleased事件并解决不触发问题
问题根因
ListView 内置的 ListViewItem 项容器会默认处理 PointerReleased 等指针路由事件,用来支持选中、拖动等原生交互逻辑,事件被标记为 Handled = true 后就不会继续冒泡到上层的 ListView 控件,因此你直接绑定在 ScheduleListView 上的事件回调不会被触发。
可行解决方案
方案1:使用AddHandler强制接收已标记处理的事件(改代码量最小)
直接修改构造函数中的事件绑定逻辑,用 AddHandler 方法订阅事件,第三个参数传 true 即可强制接收哪怕被标记为已处理的路由事件,原有事件处理方法不用修改:
// 替换原来的 ScheduleListView.PointerReleased += LVI_PointerReleased; 为下面的代码 ScheduleListView.AddHandler(UIElement.PointerReleasedEvent, new PointerRoutedEventHandler(LVI_PointerReleased), true);
方案2:将事件绑定到每个ListViewItem容器
直接在XAML的ListView样式中给所有项容器绑定 PointerReleased 事件,避开上层事件冒泡拦截:
<ListView x:Name="ScheduleListView"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <EventSetter Event="PointerReleased" Handler="LVI_PointerReleased"/> </Style> </ListView.ItemContainerStyle> <!-- 你原有ListView的其他配置 --> </ListView>
方案3:使用ListView内置的ItemClick事件(更符合列表交互场景)
如果你的需求就是点击列表任意区域后触发逻辑,可以直接用ListView原生的点击事件,无需处理指针事件的拦截问题:
- 先给ListView开启点击功能:
<ListView x:Name="ScheduleListView" IsItemClickEnabled="True" ItemClick="ScheduleListView_ItemClick">
- 后台实现对应事件方法:
private void ScheduleListView_ItemClick(object sender, ItemClickEventArgs e) { CardSwipe.Focus(FocusState.Pointer); }
内容的提问来源于stack exchange,提问作者Rez Khan
相关产品推荐
相关产品推荐

