You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI如何根据物理屏幕尺寸计算宽高单位?

MAUI 屏幕尺寸单位转换与物理尺寸适配方案

核心问题解析

你遇到的计算差异,核心原因是全屏物理尺寸和页面可用布局尺寸的区别:

  • DeviceDisplay.Current.MainDisplayInfo 返回的是屏幕的物理像素全屏尺寸,转换后的DIP值是全屏理论尺寸
  • OnSizeAllocated 返回的是页面扣除系统状态栏、导航栏(Android)、安全区域(iOS)后的实际可用布局尺寸,所以会比全屏尺寸小

另外,Xamarin关于单位转换的核心逻辑在MAUI中依然适用,但MAUI在系统UI适配、安全区域处理上有细节调整,需要注意区分全屏与可用空间。

MAUI 单位体系与转换公式

MAUI 使用与设备无关的单位(DIP/DPS),核心定义:

  1. 1 DIP = 160 DPI 屏幕上的1物理像素
  2. Density = 设备实际DPI / 160(即物理像素与DIP的缩放比)
  3. 物理尺寸(英寸)= 物理像素数 / 设备DPI = DisplayInfo.Width/(Density*160)
  4. 英寸转DIP:DIP值 = 英寸数 * 160(因为1英寸在任何DPI下对应的DIP固定为160,推导过程:物理像素=英寸*DPI=英寸*160*Density → DIP=物理像素/Density=英寸*160)

解决你的测试案例疑问

以Pixel 5模拟器为例:

DisplayInfo.Height:2340(物理像素),Density:2.75
全屏DIP高度 = 2340 / 2.75 = 850.9(理论全屏尺寸)
OnSizeAllocated返回的654.18是扣除状态栏、底部导航栏后的可用布局高度,属于正常现象

如果需要获取全屏布局空间,可以通过以下方式:

  • Android:在Activity中设置全屏主题,或隐藏系统导航栏
  • MAUI全局:设置WindowState="Maximized"并禁用安全区域适配

物理尺寸获取与元素适配实现

以下是针对你的需求编写的C#工具类和适配代码,仅适配iOS和Android:

1. 屏幕物理尺寸工具类

public static class ScreenDimensionHelper
{
    // 获取屏幕物理宽度(英寸)
    public static double GetPhysicalWidthInches()
    {
        var displayInfo = DeviceDisplay.Current.MainDisplayInfo;
        double dpi = displayInfo.Density * 160;
        return displayInfo.Width / dpi;
    }

    // 获取屏幕物理高度(英寸)
    public static double GetPhysicalHeightInches()
    {
        var displayInfo = DeviceDisplay.Current.MainDisplayInfo;
        double dpi = displayInfo.Density * 160;
        return displayInfo.Height / dpi;
    }

    // 获取屏幕对角线尺寸(英寸)
    public static double GetPhysicalDiagonalInches()
    {
        double width = GetPhysicalWidthInches();
        double height = GetPhysicalHeightInches();
        return Math.Sqrt(Math.Pow(width, 2) + Math.Pow(height, 2));
    }

    // 英寸转MAUI DIP单位
    public static double InchesToDip(double inches)
    {
        return inches * 160;
    }
}

2. 元素适配逻辑实现

指定元素最大宽度为2.5英寸

// 计算2.5英寸对应的DIP值
double maxWidthDip = ScreenDimensionHelper.InchesToDip(2.5);
// 获取屏幕全屏DIP宽度,避免元素超出屏幕
double screenFullWidthDip = DeviceDisplay.Current.MainDisplayInfo.Width / DeviceDisplay.Current.MainDisplayInfo.Density;
// 设置元素最大宽度(取两者最小值)
yourElement.MaximumWidthRequest = Math.Min(maxWidthDip, screenFullWidthDip);

根据屏幕是否超过5英寸调整元素高度

double diagonalInches = ScreenDimensionHelper.GetPhysicalDiagonalInches();
if (diagonalInches > 5)
{
    yourElement.HeightRequest = 120; // 大屏设备高度
}
else
{
    yourElement.HeightRequest = 80; // 小屏设备高度
}

内容的提问来源于stack exchange,提问作者TheXenocide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:57:04