diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index b358763c1d..a7c4bd5445 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -682,8 +682,8 @@ namespace Avalonia.Controls IsVisible = true; var initialSize = new Size( - double.IsNaN(Width) ? ClientSize.Width : Width, - double.IsNaN(Height) ? ClientSize.Height : Height); + double.IsNaN(Width) ? Math.Max(MinWidth, ClientSize.Width) : Width, + double.IsNaN(Height) ? Math.Max(MinHeight, ClientSize.Height) : Height); if (initialSize != ClientSize) { diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index a8c9b68d12..0cdde445d5 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -540,6 +540,33 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(window.Position, expectedPosition); } } + + [Fact] + public void Window_Should_Be_Sized_To_MinSize_If_InitialSize_Less_Than_MinSize() + { + var screen1 = new Mock(1.75, new PixelRect(new PixelSize(1920, 1080)), new PixelRect(new PixelSize(1920, 966)), true); + var screens = new Mock(); + screens.Setup(x => x.AllScreens).Returns(new Screen[] { screen1.Object }); + screens.Setup(x => x.ScreenFromPoint(It.IsAny())).Returns(screen1.Object); + + var windowImpl = MockWindowingPlatform.CreateWindowMock(400, 300); + windowImpl.Setup(x => x.DesktopScaling).Returns(1.75); + windowImpl.Setup(x => x.RenderScaling).Returns(1.75); + windowImpl.Setup(x => x.Screen).Returns(screens.Object); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = new Window(windowImpl.Object); + window.WindowStartupLocation = WindowStartupLocation.CenterScreen; + window.MinWidth = 720; + window.MinHeight = 480; + + window.Show(); + + Assert.Equal(new PixelPoint(330, 63), window.Position); + Assert.Equal(new Size(720, 480), window.Bounds.Size); + } + } [Fact] public void Window_Should_Be_Centered_Relative_To_Owner_When_WindowStartupLocation_Is_CenterOwner() diff --git a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs index 317a1c50d6..e1888d671c 100644 --- a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs +++ b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs @@ -21,11 +21,11 @@ namespace Avalonia.UnitTests _popupImpl = popupImpl; } - public static Mock CreateWindowMock() + public static Mock CreateWindowMock(double initialWidth = 800, double initialHeight = 600) { var windowImpl = new Mock(); var position = new PixelPoint(); - var clientSize = new Size(800, 600); + var clientSize = new Size(initialWidth, initialHeight); windowImpl.SetupAllProperties(); windowImpl.Setup(x => x.ClientSize).Returns(() => clientSize); @@ -55,12 +55,18 @@ namespace Avalonia.UnitTests windowImpl.Setup(x => x.Resize(It.IsAny(), It.IsAny())) .Callback((x, y) => { - clientSize = x.Constrain(s_screenSize); - windowImpl.Object.Resized?.Invoke(clientSize, y); + var constrainedSize = x.Constrain(s_screenSize); + + if (constrainedSize != clientSize) + { + clientSize = constrainedSize; + windowImpl.Object.Resized?.Invoke(clientSize, y); + } }); windowImpl.Setup(x => x.Show(true, It.IsAny())).Callback(() => { + windowImpl.Object.Resized?.Invoke(windowImpl.Object.ClientSize, PlatformResizeReason.Unspecified); windowImpl.Object.Activated?.Invoke(); });