From maui-skills
Guards .NET MAUI projects against deprecated, obsolete, or removed APIs in XAML/C#, Blazor Hybrid, and MauiReactor. Detects target frameworks/library versions and provides replacement patterns for code generation/review/editing.
npx claudepluginhub davidortinau/maui-skills --plugin maui-skillsThis skill uses the workspace's default tool permissions.
This skill prevents you from generating code that uses deprecated, obsolete, or removed APIs.
Guides Xamarin.Forms to .NET MAUI migration including project setup, namespace renames, layout fixes, renderer-to-handler migration, effects-to-behaviors redesign, NuGet updates, data migration, and troubleshooting.
Guides .NET MAUI safe area and edge-to-edge layouts for .NET 10+ using SafeAreaEdges, SafeAreaRegions, keyboard avoidance on Android, iOS, Mac Catalyst, with Blazor Hybrid support and legacy migrations.
Generates .NET MAUI Shell pages, ViewModels, navigation services, source-generated routes, and dialogs using Shiny MAUI Shell. For MAUI apps with advanced Shell navigation, lifecycle hooks, and tab badges.
Share bugs, ideas, or general feedback.
This skill prevents you from generating code that uses deprecated, obsolete, or removed APIs. Read this before writing any .NET MAUI, Blazor Hybrid, or MauiReactor code.
Follow these steps before generating any MAUI-related code:
Read the project's .csproj file and find <TargetFramework> or <TargetFrameworks>:
<!-- Single target -->
<TargetFramework>net10.0-android</TargetFramework>
<!-- Multi-target (typical MAUI project) -->
<TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst;net10.0-windows10.0.19041.0</TargetFrameworks>
The version number (net10.0, net9.0, net8.0) determines which APIs are available.
Always target the version in the project file — never assume a version.
Scan <PackageReference> entries and <ItemGroup> for key packages:
| Package | What it tells you |
|---|---|
Microsoft.Maui.Controls | MAUI version (if explicit) |
CommunityToolkit.Maui | Toolkit version — APIs change between major versions |
CommunityToolkit.Mvvm | MVVM Toolkit version — needed for WeakReferenceMessenger |
Reactor.Maui | MauiReactor version — v3+ has different APIs than v2 |
Microsoft.AspNetCore.Components.WebView.Maui | Blazor Hybrid version |
If no explicit MAUI package version is listed, the MAUI SDK version matches the <TargetFramework> .NET version.
Before using any API, ask yourself:
Microsoft.Maui.Controls.Compatibility.* types are migration aids, not recommended for new code.using Xamarin.Forms or using Xamarin.Essentials — these are not MAUI.Compatibility namespace in new projects (Compatibility.RelativeLayout, Compatibility.StackLayout, etc.).async method names when both sync-named and async-named versions exist (e.g., DisplayAlertAsync over DisplayAlert).| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
ListView | CollectionView | ListView, EntryCell, ImageCell, SwitchCell, TextCell, ViewCell, and Cell are all deprecated in .NET 10 |
TableView | CollectionView or custom layout | Deprecated in .NET 10 |
Frame | Border | Frame is a Xamarin.Forms legacy control; Border is the MAUI replacement with StrokeShape support |
Compatibility.RelativeLayout | Grid | Migration-only; removed from templates in .NET 10 |
Compatibility.StackLayout | VerticalStackLayout / HorizontalStackLayout | The compatibility StackLayout wraps Xamarin layout logic. Use the native MAUI stack layouts for better performance |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
ClickGestureRecognizer | TapGestureRecognizer | Removed in .NET 10 |
Accelerator | KeyboardAccelerator | Removed from Microsoft.Maui.Controls in .NET 10 |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
Page.IsBusy | ActivityIndicator | IsBusy is obsolete in .NET 10; use an explicit activity indicator |
DisplayAlert() | DisplayAlertAsync() | Sync-named versions deprecated; use async versions |
DisplayActionSheet() | DisplayActionSheetAsync() | Same as above |
MessagingCenter | WeakReferenceMessenger (CommunityToolkit.Mvvm) | Made internal in .NET 10 |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
FadeTo() | FadeToAsync() | All animation extension methods renamed to *Async in .NET 10 |
RotateTo(), ScaleTo(), TranslateTo(), etc. | RotateToAsync(), ScaleToAsync(), TranslateToAsync(), etc. | Same pattern — RelRotateTo → RelRotateToAsync, RelScaleTo → RelScaleToAsync, LayoutTo → LayoutToAsync |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
Device.RuntimePlatform | DeviceInfo.Platform | The entire Device class is deprecated |
Device.BeginInvokeOnMainThread() | MainThread.BeginInvokeOnMainThread() | Use Microsoft.Maui.ApplicationModel.MainThread |
Device.InvokeOnMainThreadAsync() | MainThread.InvokeOnMainThreadAsync() | Same |
Device.OpenUri() | Launcher.OpenAsync() | Use Microsoft.Maui.ApplicationModel.Launcher |
Device.StartTimer() | Dispatcher.StartTimer() or PeriodicTimer | Use the dispatcher or standard .NET timer |
DependencyService | Constructor injection via IServiceProvider | Register services in MauiProgram.cs with builder.Services |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
FontImageExtension (XAML markup extension) | FontImageSource (type) | Use <FontImageSource> element or property syntax |
Color.FromHex() | Color.FromArgb() | FromHex is obsolete |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
Page.UseSafeArea (iOS platform-specific) | SafeAreaEdges property | New in .NET 10; ContentPage defaults to None (edge-to-edge) on all platforms |
Layout.IgnoreSafeArea | SafeAreaEdges property | Use the unified safe area API |
| ❌ Deprecated / Removed | ✅ Use Instead | Notes |
|---|---|---|
AutomationProperties.Name | SemanticProperties.Description | AutomationProperties still works but SemanticProperties is the MAUI-native approach |
AutomationProperties.HelpText | SemanticProperties.Hint | Same |
iOS SetAccessibilityHint / SetAccessibilityLabel (Compatibility extensions) | Microsoft.Maui.Platform.UpdateSemantics() | Deprecated in .NET 10 |
| ❌ Deprecated Package | ✅ Use Instead | Notes |
|---|---|---|
Xamarin.Forms | Microsoft.Maui.Controls | Completely different API surface |
Xamarin.Essentials | Built-in MAUI APIs (Microsoft.Maui.Devices, Microsoft.Maui.ApplicationModel, etc.) | Essentials is merged into MAUI |
Xamarin.CommunityToolkit | CommunityToolkit.Maui | Different namespace and API surface |
Microsoft.Toolkit.Mvvm | CommunityToolkit.Mvvm | Package was renamed |
MauiReactor v3+ (for .NET MAUI 9/10):
.csproj via <RuntimeHostConfigurationOption>. Do NOT use the v2 EnableMauiReactorHotReload() call in MauiProgram.cs.ListView), the MauiReactor wrapper is also effectively deprecated. Use the MauiReactor wrapper for the replacement control (e.g., CollectionView).State<T> and Props<T> — not older RxComponent patterns if they appear in outdated examples.Navigation.PushAsync<PageComponent>()) — do NOT mix in MAUI Shell GoToAsync unless deliberately integrating Shell.BlazorWebView — not the legacy WebView — for hosting Razor components.@rendermode directives, [SupplyParameterFromQuery], and the latest component model.IJSRuntime.InvokeAsync<T>() — not the obsolete synchronous IJSInProcessRuntime patterns for mobile.env(safe-area-inset-*) — do NOT combine XAML SafeAreaEdges and CSS safe area padding on the same element (causes double-padding).WebResourceRequested event on BlazorWebView and HybridWebView for intercepting requests.| TFM Pattern | .NET Version |
|---|---|
net10.0-* | .NET 10 (latest, current) |
net9.0-* | .NET 9 |
net8.0-* | .NET 8 (LTS) |
If the .csproj uses <UseMaui>true</UseMaui>, the MAUI version matches the TFM:
net10.0 → MAUI 10net9.0 → MAUI 9Check <PackageReference Include="Reactor.Maui" Version="X.Y.Z" />:
EnableMauiReactorHotReload() builder patternCheck <PackageReference Include="CommunityToolkit.Maui" Version="X.Y.Z" />:
.csproj first. Never generate code without knowing the target framework.Xamarin.* namespaces. They do not exist in MAUI.Compatibility.* types in new projects. They are migration aids only.Device.* API. The Device class is fully deprecated.*Async method names for animations, alerts, and action sheets in .NET 10+.