Browse Source

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.
pull/20857/head
mfkl 2 weeks ago
committed by GitHub
parent
commit
425346612c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 13
      src/Avalonia.Controls/NativeControlHost.cs

13
src/Avalonia.Controls/NativeControlHost.cs

@ -4,6 +4,7 @@ using System.Diagnostics;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Controls.Automation.Peers; using Avalonia.Controls.Automation.Peers;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Layout;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Threading; using Avalonia.Threading;
@ -152,6 +153,18 @@ namespace Avalonia.Controls
if (transformToVisual == null) if (transformToVisual == null)
return null; return null;
var transformedRect = new Rect(default, bounds.Size).TransformToAABB(transformToVisual.Value); 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; return transformedRect;
} }

Loading…
Cancel
Save