Maintaining Xamarin.Forms Shell Apps After Xamarin Support Ends
A practical guide for teams still running Xamarin.Forms Shell applications, covering the current support status, a migration checklist to .NET MAUI Shell, and the trade‑offs to consider before deciding to stay or move.
18 Oct 2026, 01:36 UTC

The problem: keeping a Xamarin.Forms Shell app alive
Many teams still have Xamarin.Forms applications that rely on Shell for navigation. In May 2024 Microsoft ended mainstream support for the Xamarin SDKs, meaning no new features, security patches, or compatibility updates for upcoming OS APIs. If you continue to ship updates, you risk hitting runtime errors on newer Android or iOS versions and exposing unpatched vulnerabilities.
Thesis: evaluate, then migrate
The prudent approach is to first verify that your current Shell‑based app still builds and runs on the oldest OS version you support, then plan a migration to .NET MAUI Shell. The migration effort is largely mechanical—replace Xamarin.Forms namespaces, adjust routing, and update handler‑based renderers—but you must weigh the cost against the risk of staying on an unsupported platform.
Understanding Xamarin.Forms Shell
Shell consolidates flyout, tabbar, and page navigation into a single XAML‑based model. Key concepts:
- AppShell: the root class that inherits from
Xamarin.Forms.Shell. - URI‑based routing: pages are registered with routes like
//home/detailsand navigated viaShell.Current.GoToAsync. - FlyoutItem and
Tab: define the flyout menu and bottom tab bar directly in XAML.
Because Shell reduces boilerplate, many teams adopted it to avoid nested MasterDetailPage and TabbedPage hierarchies.
Worked example: Shell XAML and its MAUI counterpart
Below is a minimal Xamarin.Forms Shell definition (not tested; treat as illustrative).
<!-- AppShell.xaml (Xamarin.Forms) -->
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.AppShell">
<FlyoutItem Title="Home" Icon="home.png">
<Tab Title="Feed" Icon="feed.png">
<ShellContent Route="FeedPage" ContentTemplate="{DataTemplate local:FeedPage}" />
</Tab>
<Tab Title="Profile" Icon="user.png">
<ShellContent Route="ProfilePage" ContentTemplate="{DataTemplate local:ProfilePage}" />
</Tab>
</FlyoutItem>
</Shell>
To migrate to .NET MAUI Shell, you would:
- Change the root namespace from
Xamarin.FormstoMicrosoft.Maui.Controls. - Update the base class:
Shellnow lives inMicrosoft.Maui.Controls. - Adjust any custom renderers to handlers (MAUI uses a handler‑based architecture).
- Keep the same URI routes; MAUI Shell understands the
//syntax. - Re‑build with the .NET MAUI workload (.NET 7 or later).
The resulting MAUI Shell file looks almost identical, only the xmlns and code‑behind namespace differ.
Trade‑offs and limitations
Staying on Xamarin.Forms Shell has the following drawbacks:
- No security patches for Xamarin SDKs after May 2024.
- Third‑party NuGet packages may stop receiving updates, increasing dependency risk.
- New OS features (e.g., Android 14 privacy changes, iOS 17 Live Activities) cannot be accessed without updating to MAUI.
Migration costs include:
- Updating all custom renderers to handlers (or removing them if MAUI provides the functionality out‑of‑the‑box).
- Potential breaking changes in navigation events; test deep links and Shell navigation guards thoroughly.
- Ensuring your CI/CD pipeline has the .NET MAUI workload installed and that Mac build agents are available for iOS.
Practical way to check the result: after migrating, run the app on a device or emulator with the oldest OS version you still support and verify that:
- Flyout and tab navigation work as expected.
- All pages load via
Shell.Current.GoToAsynccalls. - No XAML parse exceptions appear in the output.
Actionable closing
If you decide to migrate, follow this checklist:
- Create a dedicated Git branch for the migration.
- Update the solution’s target frameworks to .NET 7 (or later) and install the .NET MAUI workload via Visual Studio Installer.
- Replace Xamarin.Forms NuGet packages with their .NET MAUI equivalents (
Microsoft.Maui.Controls,Microsoft.Maui.Essentials). - Run a full build and resolve any namespace or type errors.
- Execute UI tests on both Android and iOS emulators covering flyout, tabs, and deep‑link navigation.
- If any critical regression appears, revert the branch (rollback) and investigate the specific renderer/handler mismatch.
- Once the branch passes validation, merge into main and update your release notes to reflect the move to .NET MAUI.
By taking these steps you turn a legacy Xamarin.Forms Shell app into a supported, forward‑compatible MAUI Shell application while keeping the navigation model your team already knows.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.