PrismWPFSample(13)まとめ

Prismを使用したWPFアプリケーション開発で役に立つと思われる項目を一つのアプリケーションにまとめたものを作りました。今まで書いてきたものの まとめです。

動作環境:Win10, Visual Studio Community 2017, Prism V7.1.0.431, .NET4.5.2, Prism Template Pack, TraceListeners, WPFLocalizeExtension, OxyPlot

f:id:feynman911:20190729002142j:plain

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 が行ってくれるので、自分でインスタンス化してはいけません。
  • Snippetを編集するには Snippet Designer が便利です。

feynman.hatenablog.com

MVVM

PrismWPFSample でMVVMデザインパターンを使用していますが、Model も BindableBase にして、直接 View からバインドできるようにしています。個人もしくは少人数で画面とコードを一緒に開発する時には、Model に直接バインドして、開発の効率化を図る事も大切だと思います。
MVVMは、画面とコードを ViewModel を間に挟んで分離する手法ですので、大人数で大規模開発を行う時には、事前の設計に基づいて厳密に ViewModel を先に確定してしまう事が大切です。ViewModel が出来てしまえば、View の開発と Model の開発を同時進行できるようになります。
しかしながら、表示するものをすべて ViewModel に持つというのは、Model と2重に持つことになるので、小規模開発の時には非効率この上なくなります。まして、個人で View も Model も同時に一人で作っていく時に ViewModel でリレーするのは、意味のない事だと思います。
MVVMだから画面表示するものは ViewModel に全部書かないといけないのではないのかという硬直的な考えを時々見かけますが、デザインパターンは単なる開発効率化の為の手段ですから、柔軟に考えるべきでしょう。
MVVMに関しても、下記に少し書いています。

feynman.hatenablog.com

モジュールを UserControl から MenuItem 書き換えてメインアプリのメニューに入れ込むことができます。
feynman.hatenablog.com

モジュールで共有するクラスにObservableCollectionを作って、メインアプリでMenuにバインドして、各モジュールからはそれにAddすることでメニューをコードで作ることも出来ます。

Log

ログの保存には TraceListener が便利です。
feynman.hatenablog.com

言語設定

WPFLocalizeExtension を使用すると簡単に多言語化できます。
github.com
Resources.resx に多国言語による文言を書き込むには ResX Manager が便利です。
github.com

feynman.hatenablog.com

アプリの設定

  • Settings.settings にアプリケーションの状態を保存しておくことができます。
  • 設定内容を DataGrid で表示する方法、書き換えて保存する方法を書きました。
  • おまけとして、DataGrid の見栄えの変更方法も書きました。

feynman.hatenablog.com

コンバーター

バインド時にデータを修正するコンバータを書きました。

  • ScaleConverter:数字に倍率とオフセットを与えます。
  • Ushort2Bit16Converter:Ushort数字を16桁の1/0文字列に変換します。(両方向変換可)
  • Ushort2HexConverter:Ushort数字をHEX文字に変換します。(両方向変換可)
  • EnumRadioConverter:ラジオボタンを一つのプロパティにバインドするためのコンバータ

feynman.hatenablog.com

  • DoubleCheck2BrushConverter:Double数字の値の大きさで色を変えるコンバータ
  • StringCheck2BrushConverter:文字列に特定の文字が含まれていた時に色を変えるコンバータ
  • BoolVisibirityConverter:Bool値をVisibirityにバインドする為のコンバータ
  • Bool2CursorWaitConverter:Bool値でマウスカーソルをBusy状態にするコンバータ
  • BoolInvertConverter:Bool値を反転させてバインドする為のコンバータ

feynman.hatenablog.com

OxyPlot

WPF用ChartライブラリーのOxyPlotの使い方について書きました。

feynman.hatenablog.com

このライブラリーを使用して、マイク音声の波形を表示するサンプルを書きました。

feynman.hatenablog.com

2重起動禁止

よくあるやつですが、2重起動禁止方法です。

feynman.hatenablog.com

ウインドウ位置保存

これもよくあるやつですが、終了時のウインドウ位置を再起動時に再現する方法です。

feynman.hatenablog.com

ビヘイビア

TextBoxで値を入力する時に、デフォルトではフォーカスが離れた時に値の更新が行われますが使いにくいので、ENTERキーで値の確定を行う為のビヘイビアを作りました。ESCキーで入力のキャンセルもできます。

feynman.hatenablog.com

サンプルの置き場所

作成したサンプルは次の場所に置いてあります。

github.com