Migrating a Xamarin.Forms App to .NET MAUI 10: 2026 Guide
Xamarin support ended on May 1, 2024, and its final releases no longer meet store requirements, so existing Xamarin apps cannot ship updates. This guide walks through moving to .NET MAUI 10 on .NET 10, comparing the GitHub Copilot modernization agent in Visual Studio with starting a new single-project app. Layouts, custom renderers and third-party packages are called out as the bulk of the work.
Key points
- Store rules block Xamarin updates: Xcode 26 for App Store uploads and Android 16 (API 36) targeting for Google Play.
- Upgrading the app to Xamarin.Forms 5.0 and refreshing NuGet packages first shrinks the API gap with .NET MAUI.
- The .NET Upgrade Assistant is deprecated; the GitHub Copilot modernization agent in Visual Studio 2026 replaces it and commits each step so changes can be reviewed or rolled back.
- RelativeLayout is gone and StackLayout's AndExpand options are deprecated, so layouts need Grid or HorizontalStackLayout/VerticalStackLayout.
- Custom renderers can derive from Microsoft.Maui.Controls.Compatibility to compile quickly, with a move to handlers as the long-term fix.
- Startup moves into MauiProgram, and Xamarin.Essentials features ship automatically once UseMaui is set in the project file.
Microsoft's support for the Xamarin SDKs ended on May 1, 2024, leaving the last Xamarin releases on Android API 34 and Xcode 15. Store rules have moved on: since April 28, 2026 the App Store requires uploads built with Xcode 26, and since August 31, 2026 Google Play requires new apps and updates to target Android 16 (API 36). An app already listed keeps running, but no update — not even a security fix — can be published.
There are two paths: kick off the project and namespace conversion with the GitHub Copilot modernization agent that replaced the deprecated .NET Upgrade Assistant, or create a new .NET MAUI project and copy the code in. The author combines both. Most of the effort lands on removing RelativeLayout, replacing the deprecated StackLayout AndExpand options, moving custom renderers to handlers and finding MAUI-compatible packages such as Firebase. Startup code moves into MauiProgram instead of MainActivity and AppDelegate, and WeakReferenceMessenger from CommunityToolkit.Mvvm replaces MessagingCenter.
Real-world use
- Moving a home-care app that is still listed in the stores but can no longer receive updates onto .NET 10 and MAUI 10.
- Resolving package compatibility for a cross-platform app that relies on Firebase notifications and Twilio Video visits.
- Gradually converting a Xamarin.Forms app with many custom renderers to the handler architecture.
- Fixing MAUI builds that fail on Windows because of long paths by shortening the NUGET_PACKAGES folder.
Why it matters
A Xamarin app can no longer ship even a security fix, so postponing the migration means losing store compatibility and maintenance entirely.
Related stories
- iOS 26 floating tab bar in .NET MAUI: what broke and how it was fixedHabr C# (ru)Oct 28
- Eight .NET MAUI accessibility problems that are easy to miss until you run the appDEV Community: #dotnetOct 18
- Deprecation notice: Low-trust SharePoint add-ins in SharePoint Server Subscription EditionMicrosoft 365 Developer Blog11 h ago