Avalonia 最大化适配不同DPI


private void FullWorkingArea()
{
    // 1. 健壮地获取当前屏幕
    var curScreen = Screens.ScreenFromPoint(this.Position) ?? Screens.Primary;
    if (curScreen == null) return;

    // 2. 获取当前屏幕的DPI缩放因子
    double scaling = curScreen.Scaling;

    // 3. 获取屏幕的工作区(WorkingArea 是物理像素)
    var workingArea = curScreen.WorkingArea; // 这是一个 PixelRect,单位是物理像素
    var wp = workingArea.Position; // 物理像素坐标

    // 4. 关键修正:将窗口的尺寸也转换到物理像素空间进行计算
    // 假设您期望的窗口逻辑尺寸与工作区相同(减去偏移量)
    var desiredWindowWidthInLogicalUnits = workingArea.Width / scaling; // 将物理尺寸转换为逻辑尺寸
    var desiredWindowHeightInLogicalUnits = workingArea.Height / scaling;

    // 5. 定义逻辑偏移量,并将其转换为物理像素偏移量
    var desiredLogicalOffset = 10;
    var physicalOffsetX = (int)Math.Round(desiredLogicalOffset * scaling);
    var physicalOffsetY = (int)Math.Round(desiredLogicalOffset * scaling);

    // 6. 应用计算
    // 窗口位置基于物理像素
    this.Position = new PixelPoint(wp.X - physicalOffsetX, wp.Y - physicalOffsetY);
    
    // 窗口尺寸设置为逻辑尺寸。Avalonia的Width/Height通常是逻辑单位。
    // 这样设置,再结合缩放因子,就能在物理屏幕上正确渲染。
    this.Width = desiredWindowWidthInLogicalUnits + (2 * desiredLogicalOffset);
    this.Height = desiredWindowHeightInLogicalUnits + (2 * desiredLogicalOffset);
}

posted @ 2025-12-02 14:36  Timskt  阅读(0)  评论(0)    收藏  举报