diff --git a/src/Dock.Avalonia/Controls/DelayedUniformTabPanel.cs b/src/Dock.Avalonia/Controls/DelayedUniformTabPanel.cs index fa463002a..ad5c08719 100644 --- a/src/Dock.Avalonia/Controls/DelayedUniformTabPanel.cs +++ b/src/Dock.Avalonia/Controls/DelayedUniformTabPanel.cs @@ -179,6 +179,7 @@ protected override Size MeasureOverride(Size availableSize) ? tabWidth : (IsFinite(targetTabWidth) ? targetTabWidth : tabWidth); var desiredWidth = (extentTabWidth * visibleCount) + (spacing * Math.Max(0, visibleCount - 1)); + desiredWidth = RoundToDevicePixels(desiredWidth); return new Size(desiredWidth, maxHeight); } @@ -205,7 +206,11 @@ protected override Size ArrangeOverride(Size finalSize) : ResolveTabWidth(visibleCount, finalSize); _resolvedInMeasurePass = false; var spacing = Math.Max(0d, ItemSpacing); + var arrangedExtentWidth = Math.Min( + finalSize.Width, + RoundToDevicePixels((tabWidth * visibleCount) + (spacing * Math.Max(0, visibleCount - 1)))); var x = 0d; + var arrangedIndex = 0; foreach (var child in Children) { @@ -215,8 +220,15 @@ protected override Size ArrangeOverride(Size finalSize) continue; } - child.Arrange(new Rect(x, 0d, tabWidth, finalSize.Height)); + var startX = RoundToDevicePixels(x); + var endX = arrangedIndex == visibleCount - 1 + ? arrangedExtentWidth + : RoundToDevicePixels(x + tabWidth); + var arrangedWidth = Math.Max(0d, endX - startX); + + child.Arrange(new Rect(startX, 0d, arrangedWidth, finalSize.Height)); x += tabWidth + spacing; + arrangedIndex++; } return finalSize; @@ -273,6 +285,19 @@ private static bool NearlyEqual(double left, double right) return Math.Abs(left - right) <= WidthEpsilon; } + private double RoundToDevicePixels(double value) + { + if (!IsFinite(value)) + { + return value; + } + + var scaling = (this.GetVisualRoot() as TopLevel)?.RenderScaling ?? 1d; + return scaling <= 0d + ? value + : Math.Round(value * scaling) / scaling; + } + private double ResolveTabWidth(int visibleCount, Size referenceSize) { var targetWidth = ComputeTargetTabWidth(visibleCount, referenceSize); diff --git a/tests/Dock.Avalonia.HeadlessTests/DelayedUniformTabPanelTests.cs b/tests/Dock.Avalonia.HeadlessTests/DelayedUniformTabPanelTests.cs index 7790ba894..9e9955d90 100644 --- a/tests/Dock.Avalonia.HeadlessTests/DelayedUniformTabPanelTests.cs +++ b/tests/Dock.Avalonia.HeadlessTests/DelayedUniformTabPanelTests.cs @@ -192,7 +192,7 @@ private static void AssertTabWidth(DelayedUniformTabPanel panel, double expected { foreach (var child in panel.Children) { - Assert.InRange(child.Bounds.Width, expectedWidth - 0.1, expectedWidth + 0.1); + Assert.InRange(child.Bounds.Width, expectedWidth - 0.1, expectedWidth + 1.1); } } }