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

.NET MAUI跨平台获取DPI/PPI方法咨询

在.NET MAUI中跨平台获取设备DPI/PPI的解决方案

由于DeviceDisplay.MainDisplayInfo仅提供缩放系数和像素尺寸,无法直接获取物理英寸信息,我们需要通过平台特定实现来获取真实DPI/PPI,进而实现SkiaSharp元素与厘米单位的转换。以下是分平台的具体方案:


1. 定义共享接口

在MAUI共享项目中创建统一接口,用于跨平台调用:

public interface IDpiService
{
    double GetHorizontalDpi();
    double GetVerticalDpi();
    double GetAverageDpi();
}

2. 各平台实现

Android平台

利用Android原生DisplayMetrics获取系统提供的真实物理DPI:

[assembly: Dependency(typeof(DpiServiceAndroid))]
namespace YourAppNamespace.Platforms.Android
{
    public class DpiServiceAndroid : IDpiService
    {
        public double GetHorizontalDpi()
        {
            var metrics = Android.App.Application.Context.Resources.DisplayMetrics;
            return metrics.Xdpi;
        }

        public double GetVerticalDpi()
        {
            var metrics = Android.App.Application.Context.Resources.DisplayMetrics;
            return metrics.Ydpi;
        }

        public double GetAverageDpi()
        {
            return (GetHorizontalDpi() + GetVerticalDpi()) / 2;
        }
    }
}

iOS平台

通过UIScreen的物理尺寸(英寸)与像素尺寸计算PPI:

[assembly: Dependency(typeof(DpiServiceIos))]
namespace YourAppNamespace.Platforms.iOS
{
    public class DpiServiceIos : IDpiService
    {
        public double GetHorizontalDpi()
        {
            var screen = UIScreen.MainScreen;
            return screen.NativeBounds.Width / screen.Bounds.Width;
        }

        public double GetVerticalDpi()
        {
            var screen = UIScreen.MainScreen;
            return screen.NativeBounds.Height / screen.Bounds.Height;
        }

        public double GetAverageDpi()
        {
            return (GetHorizontalDpi() + GetVerticalDpi()) / 2;
        }
    }
}

Windows平台

使用DisplayInformation获取系统DPI,如需物理DPI可结合屏幕物理尺寸计算:

[assembly: Dependency(typeof(DpiServiceWindows))]
namespace YourAppNamespace.Platforms.Windows
{
    public class DpiServiceWindows : IDpiService
    {
        public double GetHorizontalDpi()
        {
            var displayInfo = Windows.Graphics.Display.DisplayInformation.GetForCurrentView();
            // 如需物理DPI,替换为以下代码:
            // var screenSize = displayInfo.ScreenSizeInInches;
            // var pixelWidth = displayInfo.ScreenWidthInRawPixels;
            // return pixelWidth / screenSize.Width;
            return displayInfo.LogicalDpi;
        }

        public double GetVerticalDpi()
        {
            var displayInfo = Windows.Graphics.Display.DisplayInformation.GetForCurrentView();
            return displayInfo.LogicalDpi;
        }

        public double GetAverageDpi()
        {
            return GetHorizontalDpi();
        }
    }
}

3. 在共享代码中使用

通过依赖服务获取实例,并实现厘米与像素的转换:

var dpiService = DependencyService.Get<IDpiService>();
var averageDpi = dpiService.GetAverageDpi();

// 厘米转像素(1厘米 = 0.3937英寸)
double CmToPixel(double cm)
{
    return cm * 0.3937 * averageDpi;
}

// 像素转厘米
double PixelToCm(double pixel)
{
    return pixel / averageDpi / 0.3937;
}

注意事项

  • Android的Xdpi/Ydpi为系统提供的物理DPI,大部分设备准确,少数定制ROM可能存在偏差。
  • iOS的计算逻辑基于系统公开的物理尺寸,精度可靠。
  • Windows的LogicalDpi是系统缩放后的DPI,若需物理真实值,使用注释中的代码结合屏幕物理尺寸计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:59:53