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

如何获取不含标题栏、导航栏及状态栏的可用屏幕高度?

嘿,我来帮你搞定这个问题!你用Application.Current.MainPage.Height拿到的高度确实会包含状态栏、导航栏这些额外元素,要获取真正的可用屏幕高度(也就是页面内容能用到的区域),得根据你用的框架来选合适的方法,下面给你几种实用的方案:

获取不含系统/页面栏的可用屏幕高度

方法1:平台特定代码(最准确)

不同平台(Android、iOS、Windows)对「可用区域」的定义略有差异,直接调用原生API是最精准的方式:

Android

在Android项目里,你可以通过WindowManager获取屏幕尺寸,再减去状态栏和导航栏的高度:

public static int GetAvailableScreenHeight(Context context)
{
    var windowManager = context.GetSystemService(Context.WindowService) as IWindowManager;
    var display = windowManager.DefaultDisplay;
    var metrics = new DisplayMetrics();
    display.GetMetrics(metrics);
    
    // 计算状态栏高度
    int statusBarHeight = 0;
    int resourceId = context.Resources.GetIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0)
    {
        statusBarHeight = context.Resources.GetDimensionPixelSize(resourceId);
    }
    
    // 计算导航栏高度
    int navigationBarHeight = 0;
    resourceId = context.Resources.GetIdentifier("navigation_bar_height", "dimen", "android");
    if (resourceId > 0)
    {
        navigationBarHeight = context.Resources.GetDimensionPixelSize(resourceId);
    }
    
    return metrics.HeightPixels - statusBarHeight - navigationBarHeight;
}

iOS

iOS里可以借助SafeAreaLayoutGuide直接拿到安全区域的高度,这就是内容能用到的最大高度:

public static nfloat GetAvailableScreenHeight()
{
    if (UIApplication.SharedApplication.KeyWindow != null)
    {
        return UIApplication.SharedApplication.KeyWindow.SafeAreaLayoutGuide.LayoutFrame.Height;
    }
    //  fallback方案
    return UIScreen.MainScreen.Bounds.Height;
}

.NET MAUI 跨平台简化

如果用的是.NET MAUI,直接用DeviceDisplay和页面的SafeAreaInsets就能快速计算:

var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
// 转换为实际物理高度(去除密度影响)
var screenHeight = mainDisplayInfo.Height / mainDisplayInfo.Density;

// 获取当前页面的安全区域内边距(包含状态栏、导航栏的高度)
var safeInsets = Application.Current.MainPage.SafeAreaInsets;
var availableHeight = screenHeight - safeInsets.Top - safeInsets.Bottom;

方法2:监听页面LayoutChanged事件

如果你不想写平台特定代码,也可以在页面加载完成后,通过监听布局变化事件获取内容容器的高度:

public YourPage()
{
    InitializeComponent();
    // 监听布局变化
    this.LayoutChanged += OnPageLayoutChanged;
}

private void OnPageLayoutChanged(object sender, EventArgs e)
{
    // Content是页面的内容容器,它的高度就是可用区域高度
    var availableHeight = this.Content.Height;
    // 只需要一次值的话,记得移除监听避免重复计算
    this.LayoutChanged -= OnPageLayoutChanged;
}

小提醒:LayoutChanged事件会触发多次(比如页面旋转、控件加载完成时),所以如果只需要一次结果,获取后记得取消监听哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:29