• WPF 可触摸移动的ScrollViewer控件


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

    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下载

  • 相关阅读:
    装饰器的加载顺序
    生成器
    迭代器
    有参装饰器与装饰器补充
    无参装饰器
    闭包函数
    函数对象与函数嵌套
    名称空间与作用域
    函数参数补充
    函数参数的使用
  • 原文地址:https://www.cnblogs.com/kybs0/p/9766324.html
Copyright © 2020-2023  润新知