From 5d4dd936badd2180d6ca12a3b02594fed41b377d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 15 Mar 2024 11:47:31 +0100 Subject: [PATCH] Constrain CenterOwner window to screen. (#14982) * Constrain CenterOwner window to screen. This logic is also present in WPF: https://github.com/dotnet/wpf/blob/3880169c020787b7e3383acb3679e5e4d538c602/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Window.cs#L3707-L3711 Fixes #2578 * Ensure min <= max when constraining window pos. --- src/Avalonia.Controls/Window.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index b4abca5510..a45f544203 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -11,6 +11,7 @@ using Avalonia.Media; using Avalonia.Platform; using Avalonia.Reactive; using Avalonia.Styling; +using Avalonia.Utilities; namespace Avalonia.Controls { @@ -943,7 +944,20 @@ namespace Avalonia.Controls var ownerRect = new PixelRect( owner.Position, PixelSize.FromSize(ownerSize, scaling)); - Position = ownerRect.CenterRect(rect).Position; + var childRect = ownerRect.CenterRect(rect); + + if (Screens.ScreenFromWindow(this)?.WorkingArea is { } constraint) + { + var maxX = constraint.Right - rect.Width; + var maxY = constraint.Bottom - rect.Height; + + if (constraint.X <= maxX) + childRect = childRect.WithX(MathUtilities.Clamp(childRect.X, constraint.X, maxX)); + if (constraint.Y <= maxY) + childRect = childRect.WithY(MathUtilities.Clamp(childRect.Y, constraint.Y, maxY)); + } + + Position = childRect.Position; } }