如何在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(); // 这里就可以用获取到的信息做你需要的处理啦 }
最后总结
- 日常开发优先用
DeviceDisplayAPI,省心省力 - 如果需要原生级别的精准数据,再用依赖服务的方式
- 注意区分逻辑像素和物理分辨率,布局用逻辑像素,图片适配等场景用物理分辨率
内容的提问来源于stack exchange,提问作者Manthiram
相关产品推荐
相关产品推荐

