Search code examples
c#avaloniaui

Avalonia keep window position after resize


I want to keep the window's position after the window has been resized. E.g, like how JPEGView handles resizing when changing image.

In WPF this code would accomplish it:

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    base.OnRenderSizeChanged(sizeInfo);

    //Calculate half of the offset to move the window

    if (sizeInfo.HeightChanged)
        Top += (sizeInfo.PreviousSize.Height - sizeInfo.NewSize.Height) / 2;

    if (sizeInfo.WidthChanged)
        Left += (sizeInfo.PreviousSize.Width - sizeInfo.NewSize.Width) / 2;
}

How would you accomplish the same in AvaloniaUI?

Update:

I've tried subscribing to ClientSizeProperty.Changed, this just forces the window to be centered on the screen

ClientSizeProperty.Changed.Subscribe(
x =>
{
    var newSize = new Size(
        ClientSize.Width + (x.OldValue.Value.Width - x.NewValue.Value.Width) / 2,
        ClientSize.Height + (x.OldValue.Value.Height - x.NewValue.Value.Height) / 2);
    var rect = new PixelRect(
        PixelPoint.Origin,
        PixelSize.FromSize(newSize, scaling));
    var screen = Screens.ScreenFromPoint(owner?.Position ?? Position);
    if (screen != null)
    {
      Position = screen.WorkingArea.CenterRect(rect).Position;
    }
});

Solution

  • I figured it out.

    ClientSizeProperty.Changed.Subscribe(size =>
    {
        var x = (size.OldValue.Value.Width - size.NewValue.Value.Width) / 2;
        var y = (size.OldValue.Value.Height - size.NewValue.Value.Height) / 2;
    
        Position = new PixelPoint(Position.X + (int)x, Position.Y + (int)y);
    });