はじめに
独学で習得してきた WPF ですが、決定的な指針が無く、開発が手探りになりがちでした。日本語の文献は少なく、ブログ等で有識者の手法を真似て実装しますが、流行り廃りが早いためなかなか環境が固まらない状況が続いていました。
それでも徐々に実務で WPF を活かせる機会が増え、これに伴い使用するフレームワークやサードパーティー類が定まってきています。ここでは 2020 年現在で自分が思う開発が捗るライブラリをいくつかご紹介します。
本文
-
Prism (Unity) + Livet (Messaging)
言わずと知れた MVVM インフラ 兼 DI コンテナです。
疎結合の土台として Prism と Unity がアプリケーション全体を支えます。
破棄された InteractionRequest の代わりは、新設された DialogService と、Livet の InteractionMessenger で補います。 -
ReactiveProperty
プロパティの変更通知は Prism でも出せますが、変更の購読や合体、コマンドへの変換まで ReactiveProperty は何でもやってくれます。
ViewModel 側の処理の起点は、ほとんどこれで記述できそうです。 -
MahApps.Metro
いわゆるデザインテンプレートになります。
デザインに自信が無くても、それっぽい見た目に仕上げてくれます。
このデザインと調和する多数のアイコンも提供されています。 -
QuickConverter
これが無いと Xaml が書けないほど頼り切ってしまっている汎用コンバーター。
Xaml 上で C# を書けるため、複雑な変換やイベントのハンドリングまでこなしてくれます。
ただし、これに浸かり過ぎると本来の Xaml って何だっけ?となります。 -
GridExtra
レイアウトに頻出する Grid の面倒な行列定義を、一行でスッキリと記述できるようになります。
一つ一つは僅か数行の差ですが、プログラム全体で見ると結構節約できています。
そのほか、まるで Bootstrap のようなレスポンシブな Grid も作れます。 -
System.Interactive
標準の LINQ には無いメソッドやサポートされていないコレクションへの拡張メソッドが豊富にあります。
あらゆるコレクションに対して、その違いを意識せず、共通ロジックで様々な操作を実行できるようになります。 -
Newtonsoft.Json
WebAPI や設定ファイルなどでスタンダードな JSON 形式との相互変換をサポートします。
とても手軽で特に何も書かずともイメージ通りに変換してくれるほか、業務ロジック的なゴリゴリの変換にも対応できる拡張性を持ち合わせています。
悩んだもの
-
MethodDecorator.Fody
アスペクト指向的に横断処理を挟んでいける黒魔導書です。
メソッドを通過した際のログ出力などに使っていますが、私が使いこなせていないため今回は入れられませんでした。 -
Vanara.PInvoke (User32, etc.)
これだけフレームワークが発展していても、際どい処理にはまだまだ現役な Win32 です。
public static extern ...
のあの記述がたくさん入っています。
ただ、どこまで Win32 に頼って良いものか、モヤモヤが晴れずにいます。
おわりに
Windows Forms の後継として登場した WPF ですが、圧倒的な知的資産を持つ Forms からの移行は、現場レベルではなかなか進まず、さらには同様の開発手法を受け継いだ UWP も登場し、WPF の今後にヤキモキしていました。
そんな中、.NET Core 3 に Windows Forms, WPF が仲間入りしたことで、再び注目が集まっています。これまでは UWP か Desktop Bridge によるパッケージ化が必要だったストアアプリ開発にもこれらが使えるようになり、開発の幅が広がっています。また、オープンソース化されたことで、有志によるフレームワークの強化にも期待が持てます。
業務アプリの開発は得てして複雑化するものです。最近では直感的に操作できるユーザビリティも求められ、単に機能を提供するだけでは済まなくなっています。強力で自由度が高い画面描画による視認性に加え、Windows の奥深くまで操作できることによるビジネスロジックの実現性も兼ね備えた WPF は、引き続き有力な選択肢の一つだと考えています。