torum

主に開発中のアプリにまつわる技術系の事。

アプリをWPFからWinUI3へ移行してみた感想

WinUI 3は1年以上前、まだプレビューバージョンだった頃に少し触ったのですが、当時はまだまだ、という感じだったんですよね・・・。

先月、Windows App SDK 1.2が公開され、WinUI 3もだいぶこなれてきたかなと思い再びWinUI 3を触ってみたところ、まあまあイケそうだったので、本格的に使ってみました。

ちょうど、以前WPFで作った「BitWallpaper」が更新しどき(というか放置気味)で、試すには手頃なアプリということもあり、これを一からWinUI3で作り直すことにしました。

github.com

このアプリ、.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。

 

アプリストアからダウンロードできます。

apps.microsoft.com