From 425346612ce76dd15c21731a057f152ed7fed7ce Mon Sep 17 00:00:00 2001 From: mfkl Date: Mon, 9 Mar 2026 23:41:43 +0700 Subject: [PATCH] Fix pixel rounding and visual transforms in NativeControlHost (#20786) Ensure that native control bounds are properly rounded when UseLayoutRounding is enabled. This prevents alignment issues with Avalonia's visual tree, especially at non-integer scaling factors. The calculation now uses LayoutHelper.RoundLayoutValue for each edge of the transformed rectangle, matching how Avalonia rounds other layout elements. --- src/Avalonia.Controls/NativeControlHost.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Avalonia.Controls/NativeControlHost.cs b/src/Avalonia.Controls/NativeControlHost.cs index 8328e0fd56..e36bec652c 100644 --- a/src/Avalonia.Controls/NativeControlHost.cs +++ b/src/Avalonia.Controls/NativeControlHost.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using Avalonia.Automation.Peers; using Avalonia.Controls.Automation.Peers; using Avalonia.Controls.Platform; +using Avalonia.Layout; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Threading; @@ -152,6 +153,18 @@ namespace Avalonia.Controls if (transformToVisual == null) return null; var transformedRect = new Rect(default, bounds.Size).TransformToAABB(transformToVisual.Value); + // Transformed rect should be pixel-rounded if layout rounding is enabled. + // This is important for native controls to align correctly with Avalonia's visual tree. + if (UseLayoutRounding) + { + var scale = LayoutHelper.GetLayoutScale(this); + var left = LayoutHelper.RoundLayoutValue(transformedRect.X, scale); + var top = LayoutHelper.RoundLayoutValue(transformedRect.Y, scale); + var right = LayoutHelper.RoundLayoutValue(transformedRect.Right, scale); + var bottom = LayoutHelper.RoundLayoutValue(transformedRect.Bottom, scale); + transformedRect = new Rect(new Point(left, top), new Point(right, bottom)); + } + return transformedRect; }