Browse Source

make lastPointerPosition trackable at the drag event (#18069)

make _lastKnownPosition trackable at dragging

adding additional comments regarding fix

delete unnecessary lines
AnastassiaP 8 months ago
parent
commit
aa07882f2f
1 changed files with 15 additions and 3 deletions
  1. 15 3
      src/Avalonia.Base/Input/PointerOverPreProcessor.cs

+ 15 - 3
src/Avalonia.Base/Input/PointerOverPreProcessor.cs

@@ -29,9 +29,21 @@ namespace Avalonia.Input
 
         public void OnNext(RawInputEventArgs value)
         {
-            if (value is RawPointerEventArgs args
-                && args.Root == _inputRoot
-                && value.Device is IPointerDevice pointerDevice)
+            if (value is RawDragEvent dragArgs)
+            {
+                // When a platform drag operation is in progress, the application does not receive
+                // pointer move events until after the drop event. This is a problem because if a
+                // popup is shown at the pointer position in the drop event, it will be shown at
+                // the position at which the drag was initiated, not the position at which the drop
+                // occurred.
+                //
+                // Solve this by updating the last known pointer position when a drag event occurs.
+                _lastKnownPosition = ((Visual)_inputRoot).PointToScreen(dragArgs.Location);
+            }
+
+            else if (value is RawPointerEventArgs args
+                     && args.Root == _inputRoot
+                     && value.Device is IPointerDevice pointerDevice)
             {
                 if (pointerDevice != _lastActivePointerDevice)
                 {