最推荐方式是使用Microsoft.Maui.Devices.DeviceDisplay类获取屏幕宽高:Width/Height返回物理像素值,随旋转实时变化;结合Density可换算为逻辑单位dp;通过MainDisplayInfoChanged事件监听尺寸变化;安全区域需平台特异性处理。

在 MAUI 中获取屏幕宽度和高度,最推荐、最可靠的方式是使用 Microsoft.Maui.Devices.DeviceDisplay 类。它能返回设备当前的屏幕尺寸(单位:像素)、密度、安全区域等关键信息,且跨平台兼容 iOS、Android、Windows 和 macOS。
获取屏幕原始像素宽高(推荐)
用 DeviceDisplay.MainDisplayInfo.Width 和 Height 可拿到主屏幕的**物理像素尺寸**,注意这是未缩放的原始值,受系统缩放(如 Windows 的 125% 缩放)或字体大小设置影响较小:
- Width / Height 返回的是整型像素值(int),例如 Android 手机可能返回 1080 × 2400
- 该值会随横竖屏旋转实时变化,适合做响应式布局判断
- 需确保在 UI 线程调用(MAUI 中通常默认满足)
换算成与密度无关的逻辑单位(dp / DIP)
若需适配不同屏幕密度(比如设计稿按 360dp 宽度基准),可结合 MainDisplayInfo.Density 换算:
- 逻辑宽度(dp)≈
MainDisplayInfo.Width / MainDisplayInfo.Density - 逻辑高度(dp)≈
MainDisplayInfo.Height / MainDisplayInfo.Density - 例如:1080px 宽 + 密度 3.0 → 约 360dp,正好匹配常见设计基准
监听屏幕方向或尺寸变化
当用户旋转设备或窗口大小改变(桌面端),可通过订阅 DeviceDisplay.MainDisplayInfoChanged 事件响应:
- 在页面初始化或 ViewModel 中注册:
DeviceDisplay.MainDisplayInfoChanged += OnDisplayInfoChanged; - 回调中重新读取
Width/Height,更新布局或刷新网格列数 - 记得在页面销毁时取消订阅,避免内存泄漏
注意安全区域(尤其是 iPhone 和全面屏 Android)
DeviceDisplay 不直接提供安全区域(Safe Area),但它是布局适配的关键。如需避开刘海/圆角/手势条:
- iOS/macOS:用
Application.Current.Windows[0].SafeArea获取Thickness - Android:目前需通过平台特定代码(
Platform.CurrentActivity?.Window?.DecorView)或社区库辅助 - 建议将屏幕尺寸 + 安全区域结合使用,比如设置内容区域内边距
基本上就这些。用好 DeviceDisplay.MainDisplayInfo 能覆盖绝大多数屏幕适配场景,不复杂但容易忽略密度换算和事件监听这两个关键点。










