From 17bf6986b0cd532e58ef4cb36869d33119230679 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Wed, 24 Jan 2024 06:35:06 +0000 Subject: [PATCH] scroll gesture - use root visual to calculate offsets (#14329) --- .../Input/GestureRecognizers/ScrollGestureRecognizer.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs index 69bf8cae5f..daffe0ce77 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs @@ -21,6 +21,7 @@ namespace Avalonia.Input.GestureRecognizers private int _gestureId; private Point _pointerPressedPoint; private VelocityTracker? _velocityTracker; + private Visual? _rootTarget; // Movement per second private Vector _inertia; @@ -99,7 +100,8 @@ namespace Avalonia.Input.GestureRecognizers EndGesture(); _tracking = e.Pointer; _gestureId = ScrollGestureEventArgs.GetNextFreeId(); - _trackedRootPoint = _pointerPressedPoint = e.GetPosition((Visual?)Target); + _rootTarget = (Visual?)(Target as Visual)?.VisualRoot; + _trackedRootPoint = _pointerPressedPoint = e.GetPosition(_rootTarget); } } @@ -107,7 +109,7 @@ namespace Avalonia.Input.GestureRecognizers { if (e.Pointer == _tracking) { - var rootPoint = e.GetPosition((Visual?)Target); + var rootPoint = e.GetPosition(_rootTarget); if (!_scrolling) { if (CanHorizontallyScroll && Math.Abs(_trackedRootPoint.X - rootPoint.X) > ScrollStartDistance) @@ -134,8 +136,8 @@ namespace Avalonia.Input.GestureRecognizers _velocityTracker?.AddPosition(TimeSpan.FromMilliseconds(e.Timestamp), _pointerPressedPoint - rootPoint); _lastMoveTimestamp = e.Timestamp; - _trackedRootPoint = rootPoint; Target!.RaiseEvent(new ScrollGestureEventArgs(_gestureId, vector)); + _trackedRootPoint = rootPoint; e.Handled = true; } } @@ -156,6 +158,7 @@ namespace Avalonia.Input.GestureRecognizers Target!.RaiseEvent(new ScrollGestureEndedEventArgs(_gestureId)); _gestureId = 0; _lastMoveTimestamp = null; + _rootTarget = null; } }