如何获取不含标题栏、导航栏及状态栏的可用屏幕高度?
嘿,我来帮你搞定这个问题!你用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
相关产品推荐
相关产品推荐

