先ほど公開した bmscorelogview ですが、これまで小物ツールを作るときに長らく使ってきた WinForms はやめて WPF でやってみよう、と決めて製作し、とりあえず公開できるところまでたどり着くことができました。そこで、今回 WPF を学習した過程や、役立った記事などを記録に残しておきたいと思います。
今 WinForms で作ろうとすると、最近増えてきている高DPI環境でのレイアウトのズレなどに悩まないといけないです。これが非常に煩わしいです。WPF ならばそこは吸収してくれます。それに、XAML での UI のレイアウトは、最初はとっつきにくいかもしれませんが、非常に柔軟性があって、慣れてくると XAML 手打ち以外考えられないみたいな状態になります。ListBox の要素をお手軽にテキスト2段表示+フォント変える、みたいのがサクッとできるのがよいです。
コーティングの面でも、覚えることがたくさんありとても勉強になりました。今回はせっかく WPF を一から勉強するので、よく WPF とセットで語られる MVVM の原則に則ってコーディングしていこうと決めました。しかし WPF / MVVM について調べていくと、データバインディングという言葉や、Livet・Prism・MVVMLight などのフレームワークの名前がちらほらでてきて、道のりが無限に遠そうで心が折れそうになります。まあデータバインディングはなんか Vue とか React みたいなことができるんだろうか?…などと思いながら、まずは基本中の基本を学びたい、ということでたどり着いたのがこの資料です。
このページの下の方にある、「WPF実践」という PDF で、WPF と MVVM についての基礎が解説されています。実際に C# プロジェクトを作って実践する内容になってます。最初の 50 ページくらいは C# 自体の基礎なので読み飛ばしつつ、120 ページくらいまで、コードの意味を考えつつ写経しながら動作を確認して…をやりました。すると「MVVM パターン」の雰囲気がなんとなくわかった気持ちになるので、次は使うフレームワークを一つ決めることにします(普通使うよみたいな空気を感じたので)。でLivetでもPrismでもいいと思うんですが今回は Prism を使うことにしました。ということで、以下のサンプルソースを読んでいきます。
公式サンプルについは、「C# Prism Wpf公式サンプルでよく使いそうな機能」で使用頻度〇になっているものを選んで読んでいきます。すると、標準の機能では面倒だった部分が、フレームワークではラップされていて便利だな~(BindableBase、DelegateCommand など)とか、Region で簡単に画面遷移ができるから、メイン画面と設定画面の行き来に使ってみたいな~とか、そんなことが分かってきました。
あとは、この覚えた最低限の知識で、自分が作りたいものに近づけていく、わからない事が出てきたらひたすらググるを繰り返していきました。
以下の記事は非常に参考になり、理解を深める助けになりました。
- MVVM について
- MVVMパターンの常識 ― 「M」「V」「VM」の役割とは?(1/5) – @IT
- プログラミングな日々: MVVMとは何か
- MVVMのModelにまつわる誤解 – the sea of fertility
- WPF + MVVM初心者が躓きReactivePropertyに救われたこと – tmori3y2のブログ
- WPFアプリのMVVM構造の設計時に留意すべきこと – cactuaroid blog
- WPFでMVVMパターン(1) – SEVENSPIRALS
- 健康的なMVVM 書いてますか? ~MVVMアンチパターン集~ – Speaker Deck
- MVVMとはなんぞやを公理から求めてみる – 滅入るんるん
それから自分も使っていたこともある「提督業も忙しい! (KanColleViewer)」が WPF 製かつオープンソースということで各所で紹介されており、こちらのソースコードも参考に読ませてもらっています。
やはり一番難しいのが、MVVM に則した設計とは? というところだと感じています。ViewModel にどこまで処理を書くべきか? とか。唯一の正解!というものがないですし。しかし正直、個人製作レベルでは設計が素晴らしかろうがうんこだろうが動けばOKというのもある意味正解だと思っていて、ここにこだわり過ぎて製作が滞るのもあれなので、適度に妥協しながら学習していくのがいいんじゃないでしょうか。