.NET MAUI中Xamarin.Essentials获取显示信息的适配问题
解决.NET MAUI屏幕尺寸适配问题
你遇到的核心问题是混淆了物理像素和MAUI布局使用的逻辑像素,以下是具体解决方法:
1. 正确获取布局用的逻辑尺寸
Microsoft.Maui.Devices.DeviceDisplay.MainDisplayInfo.Height返回的是设备物理像素,而MAUI布局系统使用的是经过屏幕密度缩放后的逻辑像素。直接用物理像素计算布局会导致尺寸严重偏大,出现显示比例不符的问题。
正确转换方式是除以屏幕密度(Density):
var displayInfo = DeviceDisplay.MainDisplayInfo; // 得到适配布局的逻辑像素尺寸 Global.height = displayInfo.Height / displayInfo.Density; Global.width = displayInfo.Width / displayInfo.Density;
2. 更可靠的页面可用尺寸获取
你已经重写了OnSizeAllocated方法,这里传入的width和height参数是当前页面扣除状态栏、导航栏等系统UI后的可用逻辑尺寸,直接使用这个值比从DeviceDisplay获取更准确,能避免系统UI占用空间带来的误差:
protected override void OnSizeAllocated(double width, double height) { base.OnSizeAllocated(width, height); // 加判断避免重复赋值(OnSizeAllocated会被多次调用) if (Math.Abs(Global.height - height) > 0.01) { Global.height = height; Global.width = width; } }
3. 优化BottomSheet布局实现
当前用HeightRequest结合全局变量的方式,配合AbsoluteLayout的布局规则容易出现偏差。更符合MAUI响应式的做法是直接使用AbsoluteLayout的相对尺寸:
private void Menu(object sender, EventArgs e) { bottomSheet = !bottomSheet; if (bottomSheet) { // 设置高度为父容器的50%(相对值.5) AbsoluteLayout.SetLayoutBounds(BottomSheet, new Rect(0.04, 1, 1, 0.5)); } else { AbsoluteLayout.SetLayoutBounds(BottomSheet, new Rect(0.04, 1, 1, 0.04)); } }
这种方式不需要依赖全局尺寸变量,布局会自动跟随页面尺寸变化。
为什么会出现70%-75%的显示比例?
以你使用的Pixel 5为例,物理高度为2340像素,屏幕密度是2.75,换算后的逻辑高度约为850。如果直接用物理像素2340*0.5=1170设置高度,这个值远大于页面可用的逻辑高度,MAUI会自动将View限制在可用空间内,最终显示的高度是页面可用高度的全部,看起来只占屏幕的70%-75%(因为扣除了状态栏等系统UI)。
内容的提问来源于stack exchange,提问作者Cabbage
相关产品推荐
相关产品推荐

