WPF使ListBox支持手势多选功能
手势功能在手持平台应用较为丰富,PC上的应用还不是很多,不过还是有一些软件已应用这个功能如遨游浏览器等,应用得当还是相当可以丰富用户的互交体验的。
接下来我将介绍如何为ListBox添加手势功能支持。
这里我们用到了InkCanvas,它有一个Gesture事件,在这个事件中我们可以得到我们所画出的形状的区域及
e.Strokes[0].GetGeometry(),然后我们对这ListBox的这个区域做命中检查VisualTreeHelper.HitTest,从中过滤出我们想选中的多个ListBoxItem.
效果图:
代码如下:

查看XAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | //鼠标指针模式 private void NoneMode_Click( object sender, RoutedEventArgs e) { m_ic.EditingMode = InkCanvasEditingMode.None; } //手势选择模式 private void SelectionMode_Click( object sender, RoutedEventArgs e) { m_ic.EditingMode = InkCanvasEditingMode.GestureOnly; listBox1.SelectedItem = null ; } //得到选中的项 private void GetSelected_Click( object sender, RoutedEventArgs e) { int count = listBox1.SelectedItems.Count; StringBuilder msg = new StringBuilder( "Selected items:" ); for ( int i = 0; i < count; i++) { var item = listBox1.SelectedItems[i] as ListBoxItem; msg.Append(item.Content); msg.Append( "," ); } msg.Append( "Count:" ); msg.Append((count-1).ToString()); MessageBox.Show(msg.ToString()); } //被选中的项 private List<ListBoxItem> _selections = new List<ListBoxItem>(5); //InkCanvas的手势事件 private void m_ic_Gesture( object sender, InkCanvasGestureEventArgs e) { listBox1.SelectedItem = null ; //清空选择 _selections.Clear(); // //命中检测手势区域中ListBox1内的控件 VisualTreeHelper.HitTest(listBox1, OnFilter, OnResult, new GeometryHitTestParameters(e.Strokes[0].GetGeometry())); foreach (ListBoxItem item in _selections) { item.IsSelected = !item.IsSelected; } } //过滤检测 private HitTestFilterBehavior OnFilter(DependencyObject potentialHitTestTarget) { ListBoxItem item = potentialHitTestTarget as ListBoxItem; if (item != null ) //查找是ListBoxItem的控件 { _selections.Add(item); return HitTestFilterBehavior.ContinueSkipSelfAndChildren; } return HitTestFilterBehavior.ContinueSkipSelf; } private HitTestResultBehavior OnResult(HitTestResult result) { return HitTestResultBehavior.Continue; } |
作者: YOYOFx
出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架