Install
$ agentstack add skill-dotnet-skills-maui-safe-area ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Safe Area & Edge-to-Edge Layout (.NET 10+)
.NET 10 introduces a brand-new, cross-platform safe area API that replaces the legacy iOS-only UseSafeArea and the layout-level IgnoreSafeArea properties. The new SafeAreaEdges property and SafeAreaRegions flags enum give you per-edge, per-control safe area management on Android, iOS, and Mac Catalyst from a single API surface.
> This is new API surface in .NET 10. If the project targets .NET 9 or earlier, these APIs do not exist. Guide the developer to the legacy ios:Page.UseSafeArea and Layout.IgnoreSafeArea properties instead.
When to Use
- Content overlaps status bar, notch, Dynamic Island, or home indicator after upgrading to .NET 10
- Implementing edge-to-edge / immersive layouts (photo viewers, video players, maps)
- Keyboard avoidance for chat or form UIs
- Migrating from
ios:Page.UseSafeArea,Layout.IgnoreSafeArea, orWindowSoftInputModeAdjust.Resize - Blazor Hybrid apps that need CSS
env(safe-area-inset-*)coordination - Mixed layouts with an edge-to-edge header but a safe-area-respecting body
When Not to Use
- Projects targeting .NET 9 or earlier — use the legacy iOS-specific APIs
- General page layout questions unrelated to system bars or keyboard — use standard layout guidance
- App lifecycle or navigation structure — use maui-app-lifecycle or Shell guidance
- Theming or visual styling — use the maui-theming skill
Inputs
- Target framework: must be
net10.0-*or later for the new APIs - Target platforms: Android, iOS, Mac Catalyst (Windows does not have system bar insets)
- UI approach: XAML/C#, Blazor Hybrid, or MauiReactor
SafeAreaRegions Enum
[Flags]
public enum SafeAreaRegions
{
None = 0, // Edge-to-edge — no safe area padding
SoftInput = 1
WindowSoftInputModeAdjust.Resize removed
If you used WindowSoftInputModeAdjust.Resize in .NET 9, replace it with SafeAreaEdges="All" on the ContentPage for equivalent keyboard avoidance.
Usage Patterns
Edge-to-edge immersive content
Set None on both page and layout — layouts default to Container:
Forms and critical content
Keyboard-aware chat layout
Mixed: edge-to-edge header + safe body + keyboard footer
Programmatic (C#)
var page = new ContentPage
{
SafeAreaEdges = SafeAreaEdges.All
};
var grid = new Grid
{
SafeAreaEdges = new SafeAreaEdges(
left: SafeAreaRegions.Container,
top: SafeAreaRegions.Container,
right: SafeAreaRegions.Container,
bottom: SafeAreaRegions.SoftInput)
};
Decision Framework
| Scenario | SafeAreaEdges value | |----------|---------------------| | Forms, critical inputs | All | | Photo viewer, video player, game | None (on page and layout) | | Scrollable content with fixed header/footer | Container | | Chat/messaging with bottom input bar | Per-edge: Container, Container, Container, SoftInput | | Blazor Hybrid app | None on page; CSS env() for insets |
Blazor Hybrid Integration
For Blazor Hybrid apps, let CSS handle safe areas to avoid double-padding.
- Page stays edge-to-edge (default in .NET 10):
- Add
viewport-fit=coverinindex.html:
- Use CSS
env()functions:
body {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
}
Available CSS environment variables: env(safe-area-inset-top), env(safe-area-inset-bottom), env(safe-area-inset-left), env(safe-area-inset-right).
Migration from Legacy APIs
| Legacy (.NET 9 and earlier) | New (.NET 10+) | |-----------------------------|----------------| | ios:Page.UseSafeArea="True" | SafeAreaEdges="Container" | | Layout.IgnoreSafeArea="True" | SafeAreaEdges="None" | | WindowSoftInputModeAdjust.Resize | SafeAreaEdges="All" on ContentPage |
The legacy properties still compile but are marked obsolete. IgnoreSafeArea="True" maps internally to SafeAreaRegions.None.
Platform-Specific Behavior
iOS & Mac Catalyst
- Safe area insets cover: status bar, navigation bar, tab bar, notch/Dynamic Island, home indicator
SoftInputincludes the keyboard when visible- Insets update automatically on rotation and UI visibility changes
ScrollViewwithDefaultmaps toUIScrollViewContentInsetAdjustmentBehavior.Automatic
Transparent navigation bar for content behind the nav bar:
Android
- Safe area insets cover: system bars (status/navigation) and display cutouts
SoftInputincludes the soft keyboard- MAUI uses
WindowInsetsCompatandWindowInsetsAnimationCompatinternally - Behavior varies by Android version and OEM edge-to-edge settings
Common Pitfalls
- Forgetting to set
Noneon the layout too.ContentPage SafeAreaEdges="None"makes the page edge-to-edge, but child layouts default toContainerand still pad inward. SetNoneon both page and layout for truly immersive content.
- Using
SoftInputdirectly on ScrollView. ScrollView manages its own content insets and ignoresSoftInput. Wrap the ScrollView in a Grid or StackLayout and applySoftInputthere.
- Confusing
DefaultwithNone.Defaultmeans "platform default for this control type" — on ScrollView (iOS) this enables automatic content insets.Nonemeans "no safe area padding at all."
- Double-padding in Blazor Hybrid. Setting
SafeAreaEdges="Container"on the page and using CSSenv(safe-area-inset-*)results in doubled insets. Pick one approach — CSS is recommended for Blazor.
- Missing
viewport-fit=coverin Blazor. Without this meta tag, CSSenv(safe-area-inset-*)values are always zero on iOS.
- Assuming .NET 9 behavior on Android. After upgrading to .NET 10, Android
ContentPagedefaults toNone(was effectivelyContainer). AddSafeAreaEdges="Container"to restore the previous behavior.
- Using legacy
ios:Page.UseSafeAreain new code. The old API is iOS-only and obsolete. Always useSafeAreaEdgesfor cross-platform safe area management.
Checklist
- [ ] Android upgrade:
SafeAreaEdges="Container"added if content goes under status bar - [ ] Edge-to-edge:
Noneset on both page and layout - [ ] ScrollView keyboard avoidance uses wrapper Grid, not ScrollView's own
SafeAreaEdges - [ ] Blazor Hybrid: using either XAML or CSS safe areas, not both
- [ ]
viewport-fit=coverin Blazor'sindex.html`` tag - [ ] Legacy
UseSafeArea/IgnoreSafeAreamigrated toSafeAreaEdges
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: dotnet
- Source: dotnet/skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.