xamarin-forms-migration について
Xamarin.Forms のプロジェクトを .NET MAUI に移行する開発者向けのガイドです。移行手順、レイアウト上の注意点、非推奨 API の確認方法を扱います。
主な機能
- 01単一プロジェクトへのコード移行
- 02名前空間と NuGet 依存関係の更新
- 03レンダラーからハンドラーへの移行
- 04エフェクトからビヘイビアへの置き換え
- 05レイアウトと API 互換性の問題調査
活用シーン
- 01Xamarin.Forms アプリの移行計画
- 02MAUI のレイアウト問題の修正
- 03カスタムレンダラーとエフェクトの置き換え
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davidortinau/ maui-skills --skill xamarin-forms-migrationインストール後、Claude Code で/xamarin-forms-migrationを入力して読み込まれたか確認します。
同梱ファイルreferences/forms-migration-api.md
詳細
Xamarin.Forms → .NET MAUI の移行
プロジェクトテンプレート、名前空間の表、API 非推奨項目の表、参照コードについては、references/forms-migration-api.md を参照してください。
⚠️ .NET Upgrade Assistant は使用しないでください。 名前空間の変更、プロジェクトファイルの更新、パッケージの置き換えは直接行ってください。変更をひとまとまり適用するごとにビルドし、コンパイラーエラーを次の修正の手がかりにしてください。
移行ワークフロー
- 新しい .NET MAUI プロジェクトを作成します(単一プロジェクトにしてください。マルチプロジェクトでは AOT/ビルドエラーが発生します)
- クロスプラットフォームコードとプラットフォームコードを
Platforms/<platform>/にコピーします - 名前空間を更新します(XAML、C#、Essentials。
references/forms-migration-api.mdを参照) - レイアウト動作の変更に対処します(以下を参照)
- レンダラーをハンドラーに移行します(互換用レンダラーは使用しないでください)
- エフェクトをビヘイビアに移行します
Microsoft.Maui.Controls.Compatibilityパッケージを削除します- NuGet 依存関係を更新します
- アプリのデータストアを移行します
bin/、obj/、Resource.designer.csを削除してビルドし、テストを繰り返します- .NET 10 の非推奨 API 一覧を基準に確認します
方針: 新しいプロジェクトを作成し、そこにコードをコピーしてください。既存のプロジェクトファイルを直接編集しないでください。
重大なレイアウト上の落とし穴
⚠️ 既定の間隔がゼロに変更されました
MAUI では、Xamarin.Forms で 6 に設定されていた間隔がゼロになります。レイアウトは気づかないうちに壊れます。
<Grid>...</Grid>
<StackLayout>...</StackLayout>
<Style TargetType="Grid">
<Setter Property="ColumnSpacing" Value="6"/>
<Setter Property="RowSpacing" Value="6"/>
</Style>
現場でのアドバイス: すべてのレイアウト値を明示的に指定してください。プラットフォームの既定値に依存しないでください。
⚠️ *AndExpand は非推奨です — 警告は表示されません
<StackLayout>
<Label Text="Hello world!"/>
<Image VerticalOptions="FillAndExpand" Source="dotnetbot.png"/>
</StackLayout>
<Grid RowDefinitions="Auto, *">
<Label Text="Hello world!"/>
<Image Grid.Row="1" Source="dotnetbot.png"/>
</Grid>
現場でのアドバイス: レイアウトツリーをフラット化してください。入れ子になった階層を、単一の Grid レイアウトに置き換えてください。
StackLayout 内の ScrollView はスクロールしません
StackLayout 内の ScrollView は、コンテンツ全体の高さまで拡張されるため、スクロールできません。代わりに、制約付きの行を設定した Grid に ScrollView を配置してください。
その他のレイアウト上の落とし穴
| 問題 | 対処方法 |
|---|---|
| Grid の列/行が宣言されておらず、レイアウトが壊れる | 常に ColumnDefinitions/RowDefinitions を明示的に追加します |
Frame の測定動作が異なる | StrokeShape を設定した Border に移行します |
BoxView が表示されない(MAUI では既定のサイズが 0×0) | WidthRequest/HeightRequest を明示的に設定します |
RelativeLayout | Grid に置き換えます(互換性名前空間のみ) |
レンダラーからハンドラーへの移行
⚠️ すべてのレンダラーをハンドラーに移行してください。互換用レンダラーは使用しないでください。親ラッパービューが作成され、パフォーマンスが低下します。
推奨:マッパーメソッドで既存のハンドラーをカスタマイズします。
// ✅ Extend existing handler — no new class needed
Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("NoBorder", (handler, view) =>
{
#if ANDROID
handler.PlatformView.Background = null;
#elif IOS || MACCATALYST
handler.PlatformView.BorderStyle = UIKit.UITextBorderStyle.None;
#endif
});
まったく新しいネイティブビューを作成する場合は、完全なハンドラーを作成してください(maui-custom-handlers スキルを参照)。
エフェクトからビヘイビアへの移行
⚠️ エフェクトはビヘイビアに変わりました。単に名前を変更するのではなく、再設計が必要です。
新しい開発では、エフェクトよりもビヘイビアまたはハンドラーマッパーによるカスタマイズを優先してください。
⚠️ 互換性パッケージは使用しないでください
Microsoft.Maui.Controls.Compatibility は、連鎖的な非互換性を引き起こします。削除して、レイアウトをネイティブに再構築してください。
廃止された依存関係
- App Center は廃止されています → Sentry、Azure Monitor などに置き換えてください
- Visual Studio for Mac は廃止されています → VS Code または Rider を使用してください
Android 固有の警告
- Android の移行は iOS よりはるかに難しく、UI の不具合が増えることを想定してください
- OEM 固有の描画差異はエミュレーターで再現できません。実機でテストしてください
- 影の描画は OEM/API レベルによって異なります。プラットフォーム固有のハンドラーコードで実装してください
- ハンドラーレベルのプロパティ変更はテーマ切り替え時に自動更新されません。テーマ変更を手動で処理してください
.NET 10 API の最新性に関する警告
移行は、非推奨 API を最初から避ける絶好の機会です。すでに廃止に向かっている MAUI API に Xamarin.Forms のコードを移行しないでください。非推奨 API の全一覧は references/forms-migration-api.md を参照し、maui-current-apis スキルを実行してください。
よくあるトラブルシューティング
| 問題 | 対処方法 |
|---|---|
Xamarin.* 名前空間が存在しない | Microsoft.Maui.* の同等の名前空間に更新します |
| CollectionView がスクロールしない | Grid に配置します(サイズを制限するため、StackLayout ではなく) |
| iOS でポップアップがページの背後に表示される | ContentPage から DisplayAlert を使用します |
| パディング/マージン/間隔が不足している | 明示的な値または暗黙的なスタイルを追加します |
| カスタムレンダラーが動作しない | ハンドラーに移行します |
| SkiaSharp が動作しない | SkiaSharp.Views.Maui パッケージに更新します |
| App.Properties のデータにアクセスできない | Preferences に移行します |
クイックチェックリスト
- ☐ 新しい .NET MAUI プロジェクト(単一プロジェクト)を作成した
- ☐ クロスプラットフォームコードとプラットフォーム固有コードをコピーした
- ☐ XAML の名前空間を
http://schemas.microsoft.com/dotnet/2021/mauiに更新した - ☐
Xamarin.Forms.*→Microsoft.Maui.*の名前空間に置き換えた - ☐
Xamarin.Essentials→ 分割された MAUI 名前空間に置き換えた - ☐ Grid の
ColumnDefinitions/RowDefinitionsを明示的に追加した - ☐
*AndExpandを Grid レイアウトに置き換えた - ☐ 間隔/パディングの値を明示的に追加した(MAUI の既定値は 0)
- ☐ レンダラーをハンドラーに移行した(シム化されたレンダラーではなく)
- ☐ エフェクトをビヘイビアーまたは MAUI エフェクトに移行した
- ☐
Microsoft.Maui.Controls.Compatibilityパッケージを削除した - ☐ .NET との互換性に合わせて NuGet の依存関係を更新した
- ☐ App.Properties、SecureStorage、VersionTracking のデータを移行した
- ☐
bin/、obj/、Resource.designer.csを削除した - ☐ 実機の Android デバイスでテストした
- ☐ パフォーマンスをプロファイリングした
- ☐ 非推奨の .NET 10 API がないことを確認した(maui-current-apis スキルを実行)