关于 maui-safe-area
面向 .NET MAUI 开发者的安全区域指南,涵盖 .NET 10+ 的行为变化与迁移。说明如何为页面和控件选择安全区域设置,并规避平台相关的布局及键盘问题。
主要功能
- 01.NET 9 到 10 迁移指导
- 02按布局场景选择 SafeAreaEdges
- 03平台特定布局注意事项
- 04Blazor Hybrid 安全区域指导
- 05设备与屏幕测试清单
适用场景
- 01升级后修复 Android 内容遮挡状态栏
- 02配置媒体视图的边缘到边缘显示
- 03让聊天输入栏在键盘弹出时保持可见
- 04避免 Blazor Hybrid 中安全区域内边距重复
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidortinau/ maui-skills --skill maui-safe-area安装后在 Claude Code 中输入/maui-safe-area确认已加载。
附带文件references/safe-area-api.md
详细介绍
安全区域 — 注意事项与最佳实践(.NET 10+)
破坏性变更
⚠️ .NET 9 → 10:ContentPage 的默认值已更改为 None
现在,ContentPage 在所有平台上默认采用延伸至边缘(None)的布局。在 .NET 9 中,
Android 的 ContentPage 行为类似于 Container。如果升级后 Android 内容延伸到了
状态栏下方,请显式添加 SafeAreaEdges="Container"。
<ContentPage>
<ContentPage SafeAreaEdges="Container">
⚠️ 迁移 WindowSoftInputModeAdjust.Resize
如果你在 .NET 9 中使用了 WindowSoftInputModeAdjust.Resize,可能需要在 ContentPage 上设置
SafeAreaEdges="All",以保持对键盘的避让。
常见注意事项
1. 布局默认值是 Container,而非 None
要实现真正的延伸至边缘布局,请在页面和布局上都设置 SafeAreaEdges="None":
<ContentPage SafeAreaEdges="None">
<Grid>
<Image Source="bg.jpg" Aspect="AspectFill" />
</Grid>
</ContentPage>
<ContentPage SafeAreaEdges="None">
<Grid SafeAreaEdges="None">
<Image Source="bg.jpg" Aspect="AspectFill" />
</Grid>
</ContentPage>
2. 在 ScrollView 上设置 SoftInput 不起作用
ScrollView 会自行管理内容内边距。请改用 Grid/StackLayout 包裹它:
<ScrollView SafeAreaEdges="SoftInput">
<Grid SafeAreaEdges="Container, Container, Container, SoftInput">
<ScrollView> ... </ScrollView>
</Grid>
3. Default 不等于 None
Default =“使用此控件类型的平台默认值。”None =“延伸至边缘。”
两者在 ScrollView 上差异很大(iOS 会将 Default 映射为自动内容内边距)。
4. Blazor Hybrid 的重复内边距
<ContentPage SafeAreaEdges="Container">
<BlazorWebView ... />
<ContentPage SafeAreaEdges="None">
<BlazorWebView ... />
5. iOS Shell/NavigationPage 延伸至边缘
除非设置透明背景并隐藏分隔线,否则内容不会延伸到导航栏后方:
<Shell Shell.BackgroundColor="#80000000"
Shell.NavBarHasShadow="False" />
决策指南
| 场景 | SafeAreaEdges 值 |
|---|---|
| 表单、关键输入项 | All |
| 照片查看器、视频播放器、游戏 | None(页面和布局均需设置) |
| 带固定页眉/页脚的可滚动内容 | Container |
| 带底部输入栏的聊天/消息界面 | 按边设置:Container, Container, Container, SoftInput |
| Blazor Hybrid 应用 | 页面设为 None,使用 CSS env() 处理内边距 |
迁移快速参考
| 旧版(.NET 9) | 新版(.NET 10+) |
|---|---|
ios:Page.UseSafeArea="True" | SafeAreaEdges="Container" |
IgnoreSafeArea="True" | SafeAreaEdges="None" |
WindowSoftInputModeAdjust.Resize | 在 ContentPage 上设置 SafeAreaEdges="All" |
旧属性仍可使用,但已弃用。
最佳实践
-
将
SafeAreaEdges与Padding结合使用——安全区域处理内边距,Padding增加视觉间距:<ContentPage SafeAreaEdges="All"> <VerticalStackLayout Padding="20"> </VerticalStackLayout> </ContentPage> -
为不同控件分别设置,以适配混合布局(延伸至边缘的页眉 + 安全区域内的正文 + 能避让键盘的页脚)。
-
对于 Blazor Hybrid,优先使用 CSS
env(),并将SafeAreaEdges="None"保留为默认设置。 在<meta viewport>标签中添加viewport-fit=cover。 -
在带刘海的设备上测试(iPhone X+、Android 屏幕开孔设备)、横屏平板以及不同尺寸的屏幕。
检查清单
- Android 升级:如果内容延伸到状态栏下方,则添加
SafeAreaEdges="Container" - 延伸至边缘:页面和布局上都设置为
None - ScrollView 键盘避让使用包装 Grid,而非 ScrollView 自身的
SafeAreaEdges - Blazor Hybrid:使用 XAML 或 CSS 安全区域方案之一,不要同时使用两者
- 在 Blazor 的
index.html的<meta viewport>标签中设置viewport-fit=cover - 将旧版
UseSafeArea/IgnoreSafeArea迁移为SafeAreaEdges