PrismWPFSample(13)まとめ
Prismを使用したWPFアプリケーション開発で役に立つと思われる項目を一つのアプリケーションにまとめたものを作りました。今まで書いてきたものの まとめです。
動作環境:Win10, Visual Studio Community 2017, Prism V7.1.0.431, .NET4.5.2, Prism Template Pack, TraceListeners, WPFLocalizeExtension, OxyPlot
Prism
Prism はMVVMデザインパターンでWPFアプリケーションのモジュール開発を行う為のフレームワークです。
Prism Library
公式サンプルは下記にあります
GitHub - PrismLibrary/Prism-Samples-Wpf: Samples that demonstrate how to use various Prism features with WPF
PrismWPFSampleでは、
- 07-Modules-Directory :指定フォルダーのモジュールDLLを読み込む
- 14-UsingEventAggregator:モジュール間通信
- 12-UsingCompositeCommands:モジュールのタブへの読込
を使っています。
共通で使用するクラスのインスタンスをPrismで生成して各モジュールの ViewModelコンストラクター の引数として渡してもらいます。
モジュールは指定された RegionName の場所に組み込まれますが、モジュール内に他のモジュールを組み込むことも出来るので便利です。
View のコードビハインドに ViewSortHint を書くことで読込順番を指定することも出来ます。
その他
- モジュールをメインプロジェクトの実行フォルダー下にコピーする必要があるので、ビルド後イベントに次の行を追加すると便利です。
xcopy "$(TargetDir)$(TargetName)*$(TargetExt)" "$(SolutionDir)$(SolutionName)\$(OutDir)Modules" /Y /S
- モジュールの方が先にビルドされてコピーされるようにビルドの順番を設定しておくと便利です。
- View を XAML Designer で作成するために、デザイン時のDataContext を ViewModel に指定しておきましょう。
実行時のインスタンス化と関連付けは Prism が行ってくれるので、自分でインスタンス化してはいけません。
- Prism Template Pack をインストールして使いましょう。
上手く機能しない時には これを参照
Prism Template Pack の不具合対応 (Version2.1.6) - メグタンの何でもブログ
- Snippetを編集するには Snippet Designer が便利です。
MVVM
PrismWPFSample でMVVMデザインパターンを使用していますが、Model も BindableBase にして、直接 View からバインドできるようにしています。個人もしくは少人数で画面とコードを一緒に開発する時には、Model に直接バインドして、開発の効率化を図る事も大切だと思います。
MVVMは、画面とコードを ViewModel を間に挟んで分離する手法ですので、大人数で大規模開発を行う時には、事前の設計に基づいて厳密に ViewModel を先に確定してしまう事が大切です。ViewModel が出来てしまえば、View の開発と Model の開発を同時進行できるようになります。
しかしながら、表示するものをすべて ViewModel に持つというのは、Model と2重に持つことになるので、小規模開発の時には非効率この上なくなります。まして、個人で View も Model も同時に一人で作っていく時に ViewModel でリレーするのは、意味のない事だと思います。
MVVMだから画面表示するものは ViewModel に全部書かないといけないのではないのかという硬直的な考えを時々見かけますが、デザインパターンは単なる開発効率化の為の手段ですから、柔軟に考えるべきでしょう。
MVVMに関しても、下記に少し書いています。
MenuItem
モジュールを UserControl から MenuItem 書き換えてメインアプリのメニューに入れ込むことができます。
feynman.hatenablog.com
モジュールで共有するクラスにObservableCollection
Log
ログの保存には TraceListener が便利です。
feynman.hatenablog.com
言語設定
WPFLocalizeExtension を使用すると簡単に多言語化できます。
github.com
Resources.resx に多国言語による文言を書き込むには ResX Manager が便利です。
github.com
アプリの設定
- Settings.settings にアプリケーションの状態を保存しておくことができます。
- 設定内容を DataGrid で表示する方法、書き換えて保存する方法を書きました。
- おまけとして、DataGrid の見栄えの変更方法も書きました。
コンバーター
バインド時にデータを修正するコンバータを書きました。
- ScaleConverter:数字に倍率とオフセットを与えます。
- Ushort2Bit16Converter:Ushort数字を16桁の1/0文字列に変換します。(両方向変換可)
- Ushort2HexConverter:Ushort数字をHEX文字に変換します。(両方向変換可)
- EnumRadioConverter:ラジオボタンを一つのプロパティにバインドするためのコンバータ
- DoubleCheck2BrushConverter:Double数字の値の大きさで色を変えるコンバータ
- StringCheck2BrushConverter:文字列に特定の文字が含まれていた時に色を変えるコンバータ
- BoolVisibirityConverter:Bool値をVisibirityにバインドする為のコンバータ
- Bool2CursorWaitConverter:Bool値でマウスカーソルをBusy状態にするコンバータ
- BoolInvertConverter:Bool値を反転させてバインドする為のコンバータ
ビヘイビア
TextBoxで値を入力する時に、デフォルトではフォーカスが離れた時に値の更新が行われますが使いにくいので、ENTERキーで値の確定を行う為のビヘイビアを作りました。ESCキーで入力のキャンセルもできます。