WinUI3 を触ってみた結果>5分でブチ切れた話し
新しく登場したUIフレームワーク WinUI3(WinUI 3 - Project Reunion 0.8 Preview)を使って、何かデスクトップアプリを作るか、既存のWPFアプリをWinUI 3に移植できるか、XAMLのUIデザインの自由度はどんなものか、具体的に評価する為に実際に触ってみたのですが・・・5分でブチ切れそうになりました。プレビュー版とはいえ、
WinUI3では、ウィンドウの位置とサイズを指定する事ができない、とか一体なにを考えてんのか・・・
もしかしてこれはUWPの悪い所の名残ではあるまいかと。Windows8の全画面スタイル「メトロ」と「ユニバーサルアプリのUWP」というMicrosoftの歴史上最悪の黒歴史を引きずっていますね。WinUI 3の起源はUWPのUIレイヤーなのは分かっていたけれど、こんな所まで影響が出てくるとは・・・
以下経緯:
まず、普通にBlankのWinUI3のプロジェクトを選択して新規にプロジェクトを作成します。この状態で試しにコンパイルして実行してみます。普通にWindowが生成されてボタンが一つ表示されています。問題ありません。
次に、ViewModelを作って、Windowに割り当てます。この方法はWPFとはちょっと違うようですが、まぁ許容範囲。問題なくプロパティの値もViewのWindowに反映される事も確認します。XAMLデザイナー無いけど慣れてるしOK、Hot Reloadはまだらしいけどコンパイルと実行は早いので無問題、と。
この時点で3分経過。
そこで、実行すると表示されるWindowのサイズと位置が邪魔なので、起動時に前回の位置に復帰するように処理を追加したいと思います。ここから急に雲行きが怪しくなってきます。
WindowのイベントにはClosingの代わりにClosed、Loadedの代わりにActivatedしかありません。WPFとは違って、UWPの名残を感じて不安になってきます。とりあえず、ClosedイベントでWindowのサイズをプロパティに保存して、ActivatedイベントでWindowのサイズを割り当てる処理を書いてみるか・・・アレ?
4分経過。
WindowのLeft、Topがありません。あ、Boundsがあるじゃん、これね。はいはい、Rectを生成して・・・ウン?
「Window.Boundsは読み取り専用のため、割り当てる事ができません」
はい?
もしかして、WinUI3アプリって、ウィンドウのサイズと位置を指定する事できないの?
助けてGoogle!検索すること約数秒・・・。
あり得ないっしょ!!!
orz.
まぁ、こうしてGitHubで直接開発者達とコミュニケーションを取って、直接的なユーザーである開発者が提案を出来る事は、昔では考えられなかったような改善なので、今後に期待しましょう。
WinUI 3も.NET MAUIも、まだプレビューだし、こりゃ使い物になるには少なくともあと数年はかかるなぁ。自分は自由過ぎるWPFで全然満足しています。
追記:
頭に来たので、勢いでBlazorも試してみた結果
一年半過ぎての追記:
WinUI3 でWindowサイズと位置を覚えて復元させるには、WinAPIを使うことで可能です。ただ、面倒なので、WinUIExというライブラリを使うことで非常に楽になります。Template StudioのWinUI3版でも使われています。