diff --git a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs
index 3b9b2d0de6..8101e79af9 100644
--- a/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs
+++ b/src/Avalonia.Base/Input/GestureRecognizers/GestureRecognizerCollection.cs
@@ -114,7 +114,13 @@ namespace Avalonia.Input.GestureRecognizers
void IGestureRecognizerActionsDispatcher.Capture(IPointer pointer, IGestureRecognizer recognizer)
{
+ var p = pointer as Pointer;
+ if (p != null && p.CapturedGestureRecognizer != null && recognizer != p.CapturedGestureRecognizer)
+ return;
+
pointer.Capture(_inputElement);
+ p?.CaptureGestureRecognizer(recognizer);
+
_pointerGrabs![pointer] = recognizer;
foreach (var r in _recognizers!)
{
diff --git a/src/Avalonia.Base/Input/IPointer.cs b/src/Avalonia.Base/Input/IPointer.cs
index 52605bb6ae..050adbabaa 100644
--- a/src/Avalonia.Base/Input/IPointer.cs
+++ b/src/Avalonia.Base/Input/IPointer.cs
@@ -1,3 +1,4 @@
+using Avalonia.Input.GestureRecognizers;
using Avalonia.Metadata;
namespace Avalonia.Input
diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs
index 4713364f00..a600624276 100644
--- a/src/Avalonia.Base/Input/Pointer.cs
+++ b/src/Avalonia.Base/Input/Pointer.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Avalonia.Input.GestureRecognizers;
using Avalonia.VisualTree;
namespace Avalonia.Input
@@ -52,6 +53,9 @@ namespace Avalonia.Input
if (Captured is Visual v3)
v3.DetachedFromVisualTree += OnCaptureDetached;
+
+ if (Captured == null)
+ CaptureGestureRecognizer(null);
}
static IInputElement? GetNextCapture(Visual parent)
@@ -69,6 +73,25 @@ namespace Avalonia.Input
public PointerType Type { get; }
public bool IsPrimary { get; }
- public void Dispose() => Capture(null);
+
+ ///
+ /// Gets the gesture recognizer that is currently capturing by the pointer, if any.
+ ///
+ internal IGestureRecognizer? CapturedGestureRecognizer { get; private set; }
+
+ public void Dispose()
+ {
+ Capture(null);
+ }
+
+ ///
+ /// Captures pointer input to the specified gesture recognizer.
+ ///
+ /// The gesture recognizer.
+ ///
+ internal void CaptureGestureRecognizer(IGestureRecognizer? gestureRecognizer)
+ {
+ CapturedGestureRecognizer = gestureRecognizer;
+ }
}
}
diff --git a/src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs b/src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs
index 5c7071a161..39ff8e3a92 100644
--- a/src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs
+++ b/src/Avalonia.Controls/PullToRefresh/RefreshVisualizer.cs
@@ -238,7 +238,6 @@ namespace Avalonia.Controls
visualizerVisual.Offset = IsPullDirectionVertical ?
new Vector3(visualizerVisual.Offset.X, 0, 0) :
new Vector3(0, visualizerVisual.Offset.Y, 0);
- visual.Offset = default;
_content.InvalidateMeasure();
break;
case RefreshVisualizerState.Interacting:
@@ -452,8 +451,6 @@ namespace Avalonia.Controls
_interactionRatioSubscription = RefreshInfoProvider.GetObservable(RefreshInfoProvider.InteractionRatioProperty)
.Subscribe(InteractionRatioObserver);
- var visual = RefreshInfoProvider.Visual;
-
_executingRatio = RefreshInfoProvider.ExecutionRatio;
}
else
diff --git a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
index 506a62525c..3259ec1a4c 100644
--- a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
@@ -2,6 +2,7 @@
using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives;
using Avalonia.Input;
+using Avalonia.Input.GestureRecognizers;
using Avalonia.Interactivity;
using Avalonia.VisualTree;
using Moq;