diff --git a/src/Avalonia.Base/Media/MediaContext.cs b/src/Avalonia.Base/Media/MediaContext.cs
index c261dd80b8..a41107360a 100644
--- a/src/Avalonia.Base/Media/MediaContext.cs
+++ b/src/Avalonia.Base/Media/MediaContext.cs
@@ -212,7 +212,12 @@ internal partial class MediaContext : ICompositorScheduler
}
while (count > 0);
}
-
+
+ ///
+ /// Executes the callback in the layout pass that will occur
+ /// immediately before the next rendered frame.
+ ///
+ /// Code to execute.
public void BeginInvokeOnRender(Action callback)
{
if (_invokeOnRenderCallbacks == null)
@@ -224,4 +229,4 @@ internal partial class MediaContext : ICompositorScheduler
if (!_isRendering)
ScheduleRender(true);
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
index 2236d87dd1..5dd0f23e8e 100644
--- a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
+++ b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
@@ -120,11 +120,11 @@ namespace Avalonia.Controls.Primitives
void IManagedPopupPositionerPopup.MoveAndResize(Point devicePoint, Size virtualSize)
{
_lastRequestedPosition = devicePoint;
- Dispatcher.UIThread.Post(() =>
+ MediaContext.Instance.BeginInvokeOnRender(() =>
{
- OverlayLayer.SetLeft(this, _lastRequestedPosition.X);
- OverlayLayer.SetTop(this, _lastRequestedPosition.Y);
- }, DispatcherPriority.Render);
+ Canvas.SetLeft(this, _lastRequestedPosition.X);
+ Canvas.SetTop(this, _lastRequestedPosition.Y);
+ });
}
double IManagedPopupPositionerPopup.Scaling => 1;