欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF 可触摸移动的ScrollViewer控件

程序员文章站 2022-12-05 11:52:34
ListBox支持触摸滑动,而ScrollViewer默认不支持。 ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中处理。 处理如下:封装成一个用户控件 注:ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反) Demo下载 ......

listbox支持触摸滑动,而scrollviewer默认不支持。

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

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

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

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

 1     /// <summary>
 2     /// 可触摸滚动的scrollviewer控件
 3     /// </summary>
 4     public class touchablescrollviewer : scrollviewer
 5     {
 6         //触摸点的坐标
 7         point _startposition;
 8         //滚动条当前位置
 9         double _startverticaloffset;
10         double _starthorizontaloffset;
11         public touchablescrollviewer()
12         {
13             touchdown += touchablescrollviewer_touchdown;
14 
15             touchup += touchablescrollviewer_touchup;
16         }
17         private void touchablescrollviewer_touchdown(object sender, 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(object sender, toucheventargs e)
33         {
34             //注销触摸移动监听
35             touchmove -= touchablescrollviewer_touchmove;
36         }
37 
38         private void touchablescrollviewer_touchmove(object sender, 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下载