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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:35:28