9.8K Views
September 30, 22
スライド概要
「【オンライン】MAUI に注目する C# Tokyo イベント」で発表した資料です。
https://csharp-tokyo.connpass.com/event/259233/
WPF+GenericHost+MVVM Toolkitのプロジェクトを MAUIに移行してみた 2022/9/30 須藤(suusanex)
自己紹介 ID:suusanex( connpass・Twitter・GitHub共通) 名前:須藤圭太 サイエンスパーク株式会社という独立系ソフトウェアベンダーに所属 4年ほど受託開発で、上流から下流まで全部を回す ここ8年ほどは、自社製品開発も担当 Windowsアプリ開発のネタが多い 勉強会もやってます。 https://sciencepark.connpass.com
概要 いままで WPF+GenericHostなコードをTemplateStudioで作成したり WinUI3+GenericHostへWPFを移植したりしてみた では WPF+GenericHostなコードをMAUIに移植できるか? ↓ GenericHostやMVVMの考え方は同じなので、割と容易に移行できる
ポイント GenericHostのIHostBuilderはMauiAppBuilderになっているが使い方は同じ CommunityToolkit.Mvvmを使ったViewModelの実装はそのまま使える xamlは手動で実装し直し TemplateStudioによる生成コード(PageのNavigation周り)はだいぶ違うので、 多分作り直した方が良い ↓ 新規のMAUIプロジェクトにViewModelとModelだけを移植した方が速そう
MAUIプロジェクトを作成してコードを移 す WPFから、ViewModelとModelのコードだけを移す 図はTemplateStudioで生成したプロジェクトの場合 NuGetでCommunityToolkit.Mvvmを入れる そのままビルドが通る(はず)
DI部分を移す Microsoft.Extension.DepenencyInjectionを使っている前提で説明 ほとんど同じなのでそのまま移植可能 WPF(GenericHost) _host = Host.CreateDefaultBuilder(e.Args) .ConfigureServices(ConfigureServices) private void ConfigureServices(HostBuilderContext context, IServiceCollection services) { //以下、コンテナ登録のコード services.AddTransient<MainPage>(); ・・・ MAUI builder .UseMauiApp<App>() .ConfigureServices() public static MauiAppBuilder ConfigureServices(this MauiAppBuilder mauiAppBuilder) { //以下、コンテナ登録のコード mauiAppBuilder.Services.AddTransient<MainPage>(); ・・・
xaml部分の例 仕様が違うので、これは書き直すしかない 単純に対応付けができるものなら、置き換えれば同じViewModelで動く WPF(GenericHost) MAUI <Button Content="TextAdd" Command="{Binding TextAdd}"/> <TextBox Text="{Binding MainText}"></TextBox> <Button Text="TextAdd" Command="{Binding TextAdd}"/> <Entry Text="{Binding MainText}"></Entry>
まとめ ちゃんと画面とロジック(ViewとViewModelなど)を分離しておけば、MAUIへ の移行は容易そう WPFプロジェクトのMAUI移植が将来の視野に入る場合、 まずはWPFのままでGenericHostやMVVM Toolkitを導入してリファクタリングし ておくと、移植しやすそう