From 6af2b2ef44edc51e6807b09df0c7a56b766b91c5 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Fri, 28 Feb 2025 10:27:06 +0100 Subject: [PATCH] Fix Window.MeasureOverride measuring with the old ClientSize (#18338) --- src/Avalonia.Controls/Window.cs | 15 ++++++++++----- tests/Avalonia.Controls.UnitTests/WindowTests.cs | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 102fd9c7ce..621b2eb871 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -995,8 +995,13 @@ namespace Avalonia.Controls { var sizeToContent = SizeToContent; var clientSize = ClientSize; - var constraint = clientSize; var maxAutoSize = PlatformImpl?.MaxAutoSizeHint ?? Size.Infinity; + var useAutoWidth = sizeToContent.HasAllFlags(SizeToContent.Width); + var useAutoHeight = sizeToContent.HasAllFlags(SizeToContent.Height); + + var constraint = new Size( + useAutoWidth || double.IsInfinity(availableSize.Width) ? clientSize.Width : availableSize.Width, + useAutoHeight || double.IsInfinity(availableSize.Height) ? clientSize.Height : availableSize.Height); if (MaxWidth > 0 && MaxWidth < maxAutoSize.Width) { @@ -1007,19 +1012,19 @@ namespace Avalonia.Controls maxAutoSize = maxAutoSize.WithHeight(MaxHeight); } - if (sizeToContent.HasAllFlags(SizeToContent.Width)) + if (useAutoWidth) { constraint = constraint.WithWidth(maxAutoSize.Width); } - if (sizeToContent.HasAllFlags(SizeToContent.Height)) + if (useAutoHeight) { constraint = constraint.WithHeight(maxAutoSize.Height); } var result = base.MeasureOverride(constraint); - if (!sizeToContent.HasAllFlags(SizeToContent.Width)) + if (!useAutoWidth) { if (!double.IsInfinity(availableSize.Width)) { @@ -1031,7 +1036,7 @@ namespace Avalonia.Controls } } - if (!sizeToContent.HasAllFlags(SizeToContent.Height)) + if (!useAutoHeight) { if (!double.IsInfinity(availableSize.Height)) { diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index 4fa1899226..839dc9e92b 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -5,6 +5,7 @@ using Avalonia.Media; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Rendering.Composition; +using Avalonia.Threading; using Avalonia.UnitTests; using Moq; using Xunit; @@ -688,10 +689,23 @@ namespace Avalonia.Controls.UnitTests Content = child }; + // Verify that the child is initially measured with our Width/Height. Show(target); Assert.Equal(1, child.MeasureSizes.Count); Assert.Equal(new Size(100, 50), child.MeasureSizes[0]); + + // Now change the bounds: verify that we are using the new Width/Height, and not the old ClientSize. + child.MeasureSizes.Clear(); + child.InvalidateMeasure(); + + target.Width = 120; + target.Height = 70; + + Dispatcher.UIThread.RunJobs(); + + Assert.Equal(1, child.MeasureSizes.Count); + Assert.Equal(new Size(120, 70), child.MeasureSizes[0]); } }