Browse Source

Constrain CenterOwner window to screen. (#14982)

* Constrain CenterOwner window to screen.

This logic is also present in WPF: 3880169c02/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Window.cs (L3707-L3711)

Fixes #2578

* Ensure min <= max when constraining window pos.
pull/14954/head
Steven Kirk 2 years ago
committed by GitHub
parent
commit
5d4dd936ba
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 16
      src/Avalonia.Controls/Window.cs

16
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;
}
}

Loading…
Cancel
Save