TouchableScrollViewer.cs 1.8 KB

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