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

如何在Xamarin.Forms中通过编程获取手机的宽高及分辨率

获取Xamarin.Forms设备屏幕宽度、高度及分辨率的实现方法

嗨,作为Xamarin.Forms新手,我完全懂你想获取设备屏幕信息的需求!下面我给你分享两种实用的实现方法,都是我在项目里亲测有效的~

一、用Xamarin.Essentials的DeviceDisplay API(简单快捷)

这是官方推荐的方法,不需要写平台特定代码,上手非常快。首先确保你的项目已经安装了Xamarin.Essentials NuGet包(如果没装,在NuGet包管理器里搜索安装就行)。

代码示例

using Xamarin.Essentials;

// 获取当前屏幕的核心信息
var displayInfo = DeviceDisplay.MainDisplayInfo;

// 屏幕宽度(*逻辑像素*,Xamarin.Forms布局用的单位)
double screenWidth = displayInfo.Width;
// 屏幕高度(*逻辑像素*)
double screenHeight = displayInfo.Height;

// 屏幕密度(每英寸像素数DPI)
double screenDpi = displayInfo.Density;

// 计算实际物理分辨率:逻辑像素 × 密度
double physicalWidth = screenWidth * screenDpi;
double physicalHeight = screenHeight * screenDpi;

小提示

  • 逻辑像素是Xamarin.Forms统一的布局单位,适配不同设备的屏幕比例,大部分布局场景用这个就够了
  • 如果需要监听屏幕旋转导致的尺寸变化,可以订阅DeviceDisplay.MainDisplayInfoChanged事件,实时更新数据

二、依赖服务获取原生平台精准信息(进阶需求)

如果DeviceDisplay满足不了你的特殊需求(比如要获取原生系统的更详细屏幕参数),可以用Xamarin.Forms的依赖服务,针对不同平台写原生实现。

第一步:定义共享接口

在共享项目里创建一个接口,统一方法名:

public interface IScreenInfoService
{
    // 获取物理宽度(实际像素数)
    int GetPhysicalScreenWidth();
    // 获取物理高度(实际像素数)
    int GetPhysicalScreenHeight();
    // 获取屏幕DPI
    double GetScreenDpi();
}

第二步:实现各平台服务

Android平台实现

在Android项目里添加如下代码:

[assembly: Dependency(typeof(ScreenInfoService))]
namespace YourAppNamespace.Droid
{
    public class ScreenInfoService : IScreenInfoService
    {
        public int GetPhysicalScreenWidth()
        {
            var windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
            var displayMetrics = new DisplayMetrics();
            windowManager.DefaultDisplay.GetRealMetrics(displayMetrics);
            return displayMetrics.WidthPixels;
        }

        public int GetPhysicalScreenHeight()
        {
            var windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
            var displayMetrics = new DisplayMetrics();
            windowManager.DefaultDisplay.GetRealMetrics(displayMetrics);
            return displayMetrics.HeightPixels;
        }

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

iOS平台实现

在iOS项目里添加如下代码:

[assembly: Dependency(typeof(ScreenInfoService))]
namespace YourAppNamespace.iOS
{
    public class ScreenInfoService : IScreenInfoService
    {
        public int GetPhysicalScreenWidth()
        {
            return (int)UIScreen.MainScreen.Bounds.Width * (int)UIScreen.MainScreen.Scale;
        }

        public int GetPhysicalScreenHeight()
        {
            return (int)UIScreen.MainScreen.Bounds.Height * (int)UIScreen.MainScreen.Scale;
        }

        public double GetScreenDpi()
        {
            // iOS基准DPI为160,乘以屏幕缩放比例得到实际DPI
            return UIScreen.MainScreen.Scale * 160;
        }
    }
}

第三步:在共享项目中调用

var screenService = DependencyService.Get<IScreenInfoService>();
if (screenService != null)
{
    int physicalWidth = screenService.GetPhysicalScreenWidth();
    int physicalHeight = screenService.GetPhysicalScreenHeight();
    double dpi = screenService.GetScreenDpi();
    // 这里就可以用获取到的信息做你需要的处理啦
}

最后总结

  • 日常开发优先用DeviceDisplay API,省心省力
  • 如果需要原生级别的精准数据,再用依赖服务的方式
  • 注意区分逻辑像素和物理分辨率,布局用逻辑像素,图片适配等场景用物理分辨率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:19