アプリをWPFからWinUI3へ移行してみた感想
WinUI 3は1年以上前、まだプレビューバージョンだった頃に少し触ったのですが、当時はまだまだ、という感じだったんですよね・・・。
先月、Windows App SDK 1.2が公開され、WinUI 3もだいぶこなれてきたかなと思い再びWinUI 3を触ってみたところ、まあまあイケそうだったので、本格的に使ってみました。
ちょうど、以前WPFで作った「BitWallpaper」が更新しどき(というか放置気味)で、試すには手頃なアプリということもあり、これを一からWinUI3で作り直すことにしました。
このアプリ、.NET Foundation 時代に作ったもので、.NET5以降に全然更新できていなかったのです。というのも、チャート表示に使用しているLiveChartsが対応してなかったからなのであります。そのLiveCharts も、LiveCharts2として開発が続いていて、今beta.700。まだベータ版ですがWinUI3にも対応しているので使っちゃいますw
WPFからWinUI 3への移行ではま~いろいろあった・・・。はまりどころも多々あったので、記憶がまだあるうちに少しメモがてらに残しておきます。
基本的に今回の移行でメインだったのは:
- Binding からx:Bindに変更
- ナビゲーションをTabコントロールからNavigationViewとPageに変更
- テーマをWindowsのシステムに任せる(既存のテーマを削除)
- x:UIDを使ったリソース文字列管理
- VisualState以外のTriggersがない(ので諦める)
- Windowサイズやポジション周り変更できない(WinUIEx使う)
- ほかにも諸々
x:Bindに変更したことでハマった(Mode=OneWayなどの指定を忘れて動かないとかw)ことも多いけれど、いろいろ便利な点もありそう。
NavigationViewとPageでのナビゲーションはあまり好きではなかったのだけれども、慣れたのか、このアプリには適していたのか、意外に良かった。ただし、実装するにはいろいろと面倒くさいことが多い。
Triggersがないのは凝ったUIのアプリには致命的かもと思った。VisualStateのState Triggerではできることに限界がある。template selector を使って一部は対応できたけど。まぁ、諦めるところは諦めるしかない。
なお、MainWindow.xamlにレイアウトを書いちゃダメ、ダメw これ、あとあと問題が出てきます。基本、新規に作るのであればTemplate Studioとか使ってそれに従ったほうが良いです。
あと、WPFと比べて細かな点がこなれていない気が。プロダクションレベルでWinUI3を採用するのはSDK v1.3でなく1.4を待ったほうが良いかもしれませんね。
今回のアプリでは直接影響はなかったものの、これは・・・という点は以下。
- マウスカーソルを変更できない(何か処理している最中にインジケーターとして使えないのは困る)。
- 名前空間も変わり、画像処理系のBitmap周りが書き直しが必要そう(でも便利になった)。
- IDataErrorInfoはあるのだけど、フォームと連携されてなく表示されない。
- Touchpad を使ったスクロールが効かない。(困る)
- あとWebView2系もいきなりクラッシュするバグとか複数あり
- GridSplitterが無い
基本デバッグの時のエラーがとにかく分かりにくいとかもありますね。それに加えて、WPFと違ってWinUI3ではパッケージ環境で動かすのがデフォっぽくて、デバッグがやりにくい。なので、self containedにするのだけどプロジェクトファイルを直弄りとか。ただ、unpackagedで実行とpackaged で実行でそれぞれ別のエラーが出るとかあるので、デバッグが面倒。ほかにもマルチスレッド周りの挙動とかClassがWPFとは微妙に違ってて、ハマるとハマるんですよね。
一番の問題は、WinUI3関連の情報がまだまだ少ないというか、UWPの情報と混ざって本当にウザい。似たようなコードで動かないとか・・・早くUWP消えろーって感じです。
WinUI3の良い点は手軽にモダンなUIにできる、ということでしょう。ぐにゅぐにゅ動きますし。
ただ、凝ったUIのアプリならやっぱりWPFですね。特にWPFからの移行だと、XAMLにアレが無い、コレも無い、とフラストレーションがたまります。VisualStudio自体も現状ではWPFからWinUI3に変えられないだろうな。まぁ別に変える必要もないけれども。
ちなみに、できたのがこれ。
こんなのもできる。Acrylic。
アプリストアからダウンロードできます。