Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
davidortinau avatar

Maui Safe Area

  • 35 installs
  • 163 repo stars
  • Updated July 6, 2026
  • davidortinau/maui-skills

Handles .NET MAUI safe area and edge-to-edge layout for .NET 10+ via SafeAreaEdges, SafeAreaRegions, per-edge control, and keyboard avoidance.

About

Guides .NET MAUI safe area and edge-to-edge layout for .NET 10+ using SafeAreaEdges, SafeAreaRegions, per-edge control, keyboard avoidance and Blazor Hybrid CSS safe areas. A developer uses it when laying out MAUI UI around notches and system bars.

  • SafeAreaEdges property and SafeAreaRegions enum with per-edge control
  • Keyboard avoidance and Blazor Hybrid CSS safe areas

Maui Safe Area by the numbers

  • 35 all-time installs (skills.sh)
  • Ranked #648 of 1,039 Mobile Development skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davidortinau/maui-skills --skill maui-safe-area

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs35
repo stars163
Last updatedJuly 6, 2026
Repositorydavidortinau/maui-skills

What it does

Handles .NET MAUI safe area and edge-to-edge layout for .NET 10+ via SafeAreaEdges, SafeAreaRegions, per-edge control, and keyboard avoidance.

Files

SKILL.mdMarkdownGitHub ↗

Safe Area — Gotchas & Best Practices (.NET 10+)

Breaking Changes

⚠️ .NET 9 → 10: ContentPage default changed to None

ContentPage now defaults to edge-to-edge (None) on all platforms. In .NET 9, Android ContentPage behaved like Container. If your Android content goes under the status bar after upgrading, add SafeAreaEdges="Container" explicitly.

<!-- ❌ .NET 10 default — content goes under status bar on Android -->
<ContentPage>

<!-- ✅ Restore .NET 9 Android behavior -->
<ContentPage SafeAreaEdges="Container">

⚠️ WindowSoftInputModeAdjust.Resize migration

If you used WindowSoftInputModeAdjust.Resize in .NET 9, you may need SafeAreaEdges="All" on the ContentPage to maintain keyboard avoidance.

Common Gotchas

1. Layouts default to Container, not None

For true edge-to-edge, set SafeAreaEdges="None" on both the page and layouts:

<!-- ❌ Grid still respects system bars (its default is Container) -->
<ContentPage SafeAreaEdges="None">
    <Grid>
        <Image Source="bg.jpg" Aspect="AspectFill" />
    </Grid>
</ContentPage>

<!-- ✅ Both page and layout set to None -->
<ContentPage SafeAreaEdges="None">
    <Grid SafeAreaEdges="None">
        <Image Source="bg.jpg" Aspect="AspectFill" />
    </Grid>
</ContentPage>

2. SoftInput on ScrollView has no effect

ScrollView manages its own content insets. Wrap it in a Grid/StackLayout instead:

<!-- ❌ SoftInput is ignored on ScrollView -->
<ScrollView SafeAreaEdges="SoftInput">

<!-- ✅ Set SoftInput on the wrapper layout -->
<Grid SafeAreaEdges="Container, Container, Container, SoftInput">
    <ScrollView> ... </ScrollView>
</Grid>

3. Default is not None

Default = "use platform defaults for this control type." None = "edge-to-edge." They differ significantly on ScrollView (iOS maps Default to automatic content insets).

4. Blazor Hybrid double-padding

<!-- ❌ XAML safe area + CSS env() = double padding -->
<ContentPage SafeAreaEdges="Container">
    <BlazorWebView ... />  <!-- CSS also uses env(safe-area-inset-*) -->

<!-- ✅ Pick ONE approach — CSS is recommended for Blazor -->
<ContentPage SafeAreaEdges="None">
    <BlazorWebView ... />  <!-- CSS handles all insets with env() -->

5. iOS Shell/NavigationPage edge-to-edge

Content won't extend behind the nav bar unless you set a transparent background AND hide the separator:

<Shell Shell.BackgroundColor="#80000000"
       Shell.NavBarHasShadow="False" />

Decision Framework

ScenarioSafeAreaEdges value
Forms, critical inputsAll
Photo viewer, video player, gameNone (on page AND layout)
Scrollable content with fixed header/footerContainer
Chat/messaging with bottom input barPer-edge: Container, Container, Container, SoftInput
Blazor Hybrid appNone on page, CSS env() for insets

Migration Quick Reference

Legacy (.NET 9)New (.NET 10+)
ios:Page.UseSafeArea="True"SafeAreaEdges="Container"
IgnoreSafeArea="True"SafeAreaEdges="None"
WindowSoftInputModeAdjust.ResizeSafeAreaEdges="All" on ContentPage

Legacy properties still work but are obsolete.

Best Practices

1. Combine `SafeAreaEdges` with `Padding` — safe area handles insets, Padding adds visual spacing:

   <ContentPage SafeAreaEdges="All">
       <VerticalStackLayout Padding="20">
           <!-- Both applied — no conflict -->
       </VerticalStackLayout>
   </ContentPage>

2. Use per-control settings for mixed layouts (edge-to-edge header + safe body + keyboard-aware footer).

3. For Blazor Hybrid, prefer CSS env() and leave SafeAreaEdges="None". Add viewport-fit=cover to the <meta viewport> tag.

4. Test on notched devices (iPhone X+, Android cutouts), tablets in landscape, and varying screen sizes.

Checklist

  • [ ] Android upgrade: SafeAreaEdges="Container" added if content goes under status bar
  • [ ] Edge-to-edge: None set 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=cover in Blazor's index.html <meta viewport> tag
  • [ ] Legacy UseSafeArea / IgnoreSafeArea migrated to SafeAreaEdges

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.