UWPの勉強をはじめました。
さて、WPFの知識だけてどこまでいけるか。
今回は簡単なツールをUWP化してみたときの感触です。
■ XAMLコントロール
WPFとはコントロールの感じが結構違うので、
UWP コントロールの一覧 をざっと確認しておくのが良いと思います。
DockPanel がない!
RelativePanel で代用する。
あとは、
UWP Community ToolKit に DockPanelがあるのでそれを使うとか。
ListView がなんかちがう!
列の概念がなく、WPF の ListBox に近い。
UWP にも ListBox はあるが、用途が違うらしい。特に理由がなければ ListView を使っておくのが良さそう。
WPF の ListView みたいに列項目のある一覧表示コントロール(DataGrid)がなさそう。さてどうしようか。
そのあたりを考察ているページがありました。
Grid に IsEnabled が無い!
Button コントロールとかにはあるんですけどね。Grid とか StackPanel に IsEnabled プロパティがありません。
BooleanToVisibilityConverter が無い!
自分で作る。
ValueConverter を作ることが多くなりそう。
Style の Setter に Binding が使えない!
Behaviourを使用した代替方法もありますが、発想から変えたほうが良さそう。
Style.Triggers が無い!
代わりに VisualStateManager を使用する?
ValueConverter で代用したほうが良いかも。
Visibility.Hidden が無い!
あまり困りはしませんがレイアウトくずれに注意。
「アプリケーションは、別のスレッドにマーシャリングされたインターフェイスを呼び出しました」
別スレッドからUI要素を操作しようとしたときの例外。PropertyChanged イベントを発行しただけでもアウトになる。厳しくなったなあ。
UWP と MVVM のパフォーマンスの関係
MVVMで処理が重くなる部分は排除したがってるように感じたので調べてみたところ、
おおよそそんな感じでした。
- Binding は遅い。 x:Bind を使おう。
- ICommand は遅い。 イベントハンドラーを使おう。
- Visibilityプロパティのバインドによるロード時のコントロール非表示化は遅い。 x:Load や x:DeferLoadStrategy を使って初期化を延期しよう。
■ ファイルアクセス
おそらく一番戸惑うのがこれ。パスを指定してファイルを開くという概念は忘れよう。
ファイルの扱い方がぜんぜんちがう!
StorageFolder とか StorageFile のオブジェクトに対する操作という扱いになります。
それらをどうやって取得するかというと、システムで用意されている特定フォルダの StorageFolder を使うか、 FolderPicker 等を使用してユーザに指定させます。パスを指定して新しいオブジェクトを作るということはできません。
FilePicker等で取得したオブジェクトは履歴等に登録することが可能で、次回起動時に再利用できます。
ファイルの Drag & Drop による取り込みは可能ですが、
ReadOnlyです。
ファイル削除の動作がゴミ箱に対応!
自身のアプリフォルダーのファイルはそのまま削除されますが、それ以外の場所のファイルはごみ箱移動が標準動作になります。
あと、ファイルコピーとかで既にファイルが存在していた場合に、ファイル名に(2)を付加する等の回避方法が指定可能になりました。
これはうれしい。
■ 既存の外部アプリの起動方法 (調査のみ、未検証)
ツール類なんかだと外部プログラムを組み合わせて結果を得ることはよくありますが、通常は呼び出せません。
exe を Appx 内に置き、FullTrust 設定にすれば呼び出せるようです。
Appx 外の exe を呼び出すには、そういう処理を行う exe を新しく作って、それを AppService にすればよいのか?
※ FullTrust 設定にすると普通のストアアプリとしては申請できなくなるので注意。DesktopBrige を使用したアプリとして特別な申請が必要?
別解として、プロトコル登録されている UWP なら
URI指定で呼び出せます。
■ 今の所の感想
「UWP は今までのWindows用ソフトとは別の新しいプラットフォーム用。制限が厳しいぞ!」
UWP は今までのWIN32デスクトップアプリ(特にファイラーやツール系のアプリ)からは簡単には移行できないと感じました。困ったらWIN32APIたたけーみたいなことができないので、全く同じ機能を提供することができません。特にファイル系が致命的に概念が異なります。UIはXAMLで書けますが、重くなるものはばっさりカットされたような感じで、いろいろと発想の転換が必要になります。
つまりWindowsでない新しいプラットフォームといったほうが近いように感じます。UWPへの移行は異なるプラットフォームへの移植と捉えたほうがよさそうです。
ただ .NET Standard があるように、コア部分は共通で使えるので、その範囲であれば共有できそうです。