WPF 可触摸移动的ScrollViewer控件
2024-10-18 18:18:29
ListBox支持触摸滑动,而ScrollViewer默认不支持。需要设置PanningMode属性,如果不设置PanningMode,如何自定义触摸滑动?
ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中处理。
处理如下:封装成一个用户控件
- TouchDown事件中记录起始点,并添加对TouchMove事件的监听
- TouchUp事件中注销TouchMove事件的监听
- 在TouchMove事件中,处理移动的偏移量。起始位置减去偏移量,即为当前滚动条的位置。
注:ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)
/// <summary>
/// 可触摸滚动的ScrollViewer控件
/// </summary>
public class TouchableScrollViewer : ScrollViewer
{
//触摸点的坐标
Point _startPosition;
//滚动条当前位置
double _startVerticalOffset;
double _startHorizontalOffset;
public TouchableScrollViewer()
{
TouchDown += TouchableScrollViewer_TouchDown; TouchUp += TouchableScrollViewer_TouchUp;
}
private void TouchableScrollViewer_TouchDown(object sender, TouchEventArgs e)
{
//添加触摸移动监听
TouchMove -= TouchableScrollViewer_TouchMove;
TouchMove += TouchableScrollViewer_TouchMove; //获取ScrollViewer滚动条当前位置
_startVerticalOffset = VerticalOffset;
_startHorizontalOffset = HorizontalOffset; //获取相对于ScrollViewer的触摸点位置
TouchPoint point = e.GetTouchPoint(this);
_startPosition = point.Position;
} private void TouchableScrollViewer_TouchUp(object sender, TouchEventArgs e)
{
//注销触摸移动监听
TouchMove -= TouchableScrollViewer_TouchMove;
} private void TouchableScrollViewer_TouchMove(object sender, TouchEventArgs e)
{
//获取相对于ScrollViewer的触摸点位置
TouchPoint endPoint = e.GetTouchPoint(this);
//计算相对位置
double diffOffsetY = endPoint.Position.Y - _startPosition.Y;
double diffOffsetX = endPoint.Position.X - _startPosition.X; //ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)
ScrollToVerticalOffset(_startVerticalOffset - diffOffsetY);
ScrollToHorizontalOffset(_startHorizontalOffset - diffOffsetX);
}
}
Demo下载
最新文章
- .NET中DateTime.Now.ToString的格式化字符串
- JS判断客户端是手机还是PC的2个代码(转)
- 在.NET使用JSON作为数据交换格式
- 一、HTML和CSS基础--HTML+CSS基础课程--第4部分
- js 数组去重 的5种方法
- HDU 1241 Oil Deposits (DFS/BFS)
- DB2存储过程实现查询表数据,生成动态SQL,并执行
- 在html页,使用ctrl,shift多选表格行
- js动画学习(五)
- php四舍五入函数(floor、ceil、round与intval)
- EF 直接修改数据,不再查询数据库
- 对Spring与SpringMVC的理解
- Kotlin——从无到有系列之高级篇(一):Lambda表达式
- ROS(indigo) 用于机器人控制的图形化编程工具--code_it robot_blockly
- Linux Shell 命令--tr
- MyBatis缓存策略
- ccf-路径解析201604-3
- Git Add,Git别名等
- JAVA自动补全代码
- oracle学习笔记一:用户管理(3)用户口令管理