From aa07882f2f0c126c6489a4848a41777c623999e7 Mon Sep 17 00:00:00 2001 From: AnastassiaP <107254966+AnastassiaP@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:46:20 +0200 Subject: [PATCH] make lastPointerPosition trackable at the drag event (#18069) make _lastKnownPosition trackable at dragging adding additional comments regarding fix delete unnecessary lines --- .../Input/PointerOverPreProcessor.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs index d5a716ba60..b989def335 100644 --- a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs +++ b/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) {