Avalonia Dialog展示在父组件中间位置

public static class SetShowCenterWindowHelper
{
    public static void SetShowCenterWindow(Window targetWindow, Window owner)
    {
        targetWindow.WindowStartupLocation = WindowStartupLocation.Manual;

// 获取主窗口的位置和大小
        var ownerPosition = owner.Position;
        var ownerWidth = owner.Width;
        var ownerHeight = owner.Height;

// 获取对话框的尺寸(确保在调用前已设置Width和Height,或使用ActualWidth/ActualHeight)
        var dialogWidth = targetWindow.Width;
        var dialogHeight = targetWindow.Height;

// 计算居中坐标
        var centerX = ownerPosition.X + (ownerWidth - dialogWidth) / 2;
        var centerY = ownerPosition.Y + (ownerHeight - dialogHeight) / 2;

// 应用计算出的位置
        targetWindow.Position = new PixelPoint((int)centerX, (int)centerY);
    }
}

  public static void SetShowCenterWindowAfterOpened(Window targetWindow, Window owner)
    {
        // 移除手动设置,改用 CenterOwner 作为初始定位,确保窗口先正常显示
        targetWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
        // 订阅 Opened 事件,该事件在窗口完成布局并显示后触发
        targetWindow.Opened += (sender, e) =>
        {
            // 此时窗口的 ActualWidth 和 ActualHeight 已是最终渲染尺寸
            var dialogWidth = targetWindow.Width;
            var dialogHeight = targetWindow.Height;

            // 获取主窗口的最终位置和尺寸
            var ownerPosition = owner.Position;
            var ownerWidth = owner.Width;
            var ownerHeight = owner.Height;

            // 计算居中坐标
            var centerX = ownerPosition.X + (ownerWidth - dialogWidth) / 2;
            var centerY = ownerPosition.Y + (ownerHeight - dialogHeight) / 2;

            // 应用计算出的位置
            targetWindow.Position = new PixelPoint((int)centerX, (int)centerY);
        };
    }

posted @ 2025-12-08 09:22  Timskt  阅读(8)  评论(0)    收藏  举报