TouchableScrollViewer.cs 1.8 KB

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