es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Avalonia mantiene la posición de la ventana después de redimensionarla.

Quiero mantener la posición de la ventana después de cambiar el tamaño de la ventana. Por ejemplo, como lo hace JPEGView al cambiar el tamaño de la imagen.

En WPF, este código lo lograría:

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

    // Calcular la mitad del desplazamiento para mover la ventana

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

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

¿Cómo se lograría lo mismo en AvaloniaUI?

Actualización:

He intentado suscribirme a ClientSizeProperty.Changed, esto solo hace que la ventana se centre en la pantalla.

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;
    }
});
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr lo mismo en AvaloniaUI, puedes manejar el evento ClientSizeChanged de la ventana y usar la propiedad Position para calcular y establecer la nueva posición de la ventana. Aquí tienes un ejemplo de código que funciona:

    protected override void OnClientSizeChanged(EventArgs e)
    {
        base.OnClientSizeChanged(e);
    
        // Calcular la nueva posición de la ventana
        double offsetX = (Bounds.Width - ClientSize.Width) / 2;
        double offsetY = (Bounds.Height - ClientSize.Height) / 2;
    
        double newX = Position.X - offsetX;
        double newY = Position.Y - offsetY;
    
        // Establecer la nueva posición de la ventana
        Position = new PixelPoint((int)newX, (int)newY);
    }
    

    Este código calcula la diferencia entre el tamaño actual de la ventana y su nuevo tamaño, luego ajusta la posición actual de la ventana en la mitad de esa diferencia para mantenerla centrada. Luego establece la nueva posición de la ventana usando la propiedad Position.

Comments are closed.