WPF 可触摸移动的ScrollViewer控件

摘要:
ListBox支持触摸滑动,而ScrollViewer默认不支持。需要设置PanningMode属性,如果不设置PanningMode,如何自定义触摸滑动?ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中处理。起始位置减去偏移量,即为当前滚动条的位置。

ListBox支持触摸滑动,而ScrollViewer默认不支持。需要设置PanningMode属性,如果不设置PanningMode,如何自定义触摸滑动?

ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中处理。

处理如下:封装成一个用户控件

  1. TouchDown事件中记录起始点,并添加对TouchMove事件的监听
  2. TouchUp事件中注销TouchMove事件的监听
  3. 在TouchMove事件中,处理移动的偏移量。起始位置减去偏移量,即为当前滚动条的位置。

注:ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)

1     /// <summary>
2     ///可触摸滚动的ScrollViewer控件
3     /// </summary>
4     public classTouchableScrollViewer : ScrollViewer
5 {
6         //触摸点的坐标
7 Point _startPosition;
8         //滚动条当前位置
9         double_startVerticalOffset;
10         double_startHorizontalOffset;
11         publicTouchableScrollViewer()
12 {
13             TouchDown +=TouchableScrollViewer_TouchDown;
14 
15             TouchUp +=TouchableScrollViewer_TouchUp;
16 }
17         private void TouchableScrollViewer_TouchDown(objectsender, TouchEventArgs e)
18 {
19             //添加触摸移动监听
20             TouchMove -=TouchableScrollViewer_TouchMove;
21             TouchMove +=TouchableScrollViewer_TouchMove;
22 
23             //获取ScrollViewer滚动条当前位置
24             _startVerticalOffset =VerticalOffset;
25             _startHorizontalOffset =HorizontalOffset;
26 
27             //获取相对于ScrollViewer的触摸点位置
28             TouchPoint point = e.GetTouchPoint(this);
29             _startPosition =point.Position;
30 }
31 
32         private void TouchableScrollViewer_TouchUp(objectsender, TouchEventArgs e)
33 {
34             //注销触摸移动监听
35             TouchMove -=TouchableScrollViewer_TouchMove;
36 }
37 
38         private void TouchableScrollViewer_TouchMove(objectsender, TouchEventArgs e)
39 {
40             //获取相对于ScrollViewer的触摸点位置
41             TouchPoint endPoint = e.GetTouchPoint(this);
42             //计算相对位置
43             double diffOffsetY = endPoint.Position.Y -_startPosition.Y;
44             double diffOffsetX = endPoint.Position.X -_startPosition.X;
45 
46             //ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)
47             ScrollToVerticalOffset(_startVerticalOffset -diffOffsetY);
48             ScrollToHorizontalOffset(_startHorizontalOffset -diffOffsetX);
49 }
50     }

Demo下载

免责声明:文章转载自《WPF 可触摸移动的ScrollViewer控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL中, 如何查询某一天, 某一月, 某一年的数据.TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF Geometry几何图形数据图标

相信大家在阅读WPF相关GitHub开源项目源码时都会看见一串串这种数据这种Geometry数据就是几何图形数据 为什么要用Geometry数据做图标? 有一种做法是使用ttf字体文件代替,不过使用ttf字体文件会出现下面几个缺点:1、团队协作不便于管理2、需要依赖特定平台3、无法灵活使用而使用Geometry的话,我们可以将这些几何图形数据存入资源字典R...

VS编程,WPF中,关于TextBlock与TextBox 控件文本垂直居中或者水平居中的说明

有时为了显示的美观性,需要将文本控件中的文字垂直或者水平居中,这里说明一下需要注意的地方。 1、对于指定了长、宽的区域,用TextBox实现文本居中例如:一个长400,高100的文本框,要实现文字居中 <TextBox FontSize="36"Width=" 400"Height=" 100"HorizontalContentAlignment="...

DevExpress WPF让创建绑定到数据的3D图表控件变得更容易(Part 1)

下载DevExpress v20.1完整版 富文本控件难上手?这堂公开课你一定不能错过,不同视图不同应用场景全解! 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 在本教程中,您将完成可视化数据源所需的步骤。 应该执行以下步骤,本文我们将...

【WPF】软件更新程序的设计思路

目标:客户端程序在启动时,自动联网检查服务端是否有新的版本,有则提示用户更新客户端。 思路: 1、打开Visual Studio,在主体程序的解决方案下再新建一个叫自动更新程序的项目。主体程序的目录是D:workspaceMyProjectClient,自动更新程序的目录是D:workspaceMyProjectUpdateTool。 2、最后打包出来时将...

WPF中UserControl的属性和事件

WPF中自定义控件有两种,一种是继承自control的自定义控件,另一种是继承自UserControl的用户控件。用户控件可以认为是一系列原生控件的集合。本文主要介绍如何创建一个用户控件,以及用户控件的自定义属性和事件。 一、创建一个用户控件 1、一种是直接创建用户控件工程,这样会生成DLL,使用时调用DLL 2、在当前工程中直接创建 创建之后会生成一...

一起谈.NET技术,WPF 自定义快捷键命令(Command) 狼人:

     命令简介      WPF 中的命令是通过实现 ICommand 接口创建的。ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged)。Execute 执行与命令关联的操作。CanExecute 确定是否可以在当前命令目标上执行命令。如果集中管理命令操作的命令管理器检测到命令源中发...