diff --git a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs index d5a716ba602..b989def3352 100644 --- a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs +++ b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs @@ -29,9 +29,21 @@ public void OnError(Exception error) 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) {