Hello World(2013版)
2016/11/19
前回も今回も、MVCのプロジェクトを細分化(モジュール化)したくてサンプル探していた気がします。
今回は前回に比べて時間的、気分的に余裕もありHello Worldで初めてのWPFに挑戦してみました。
NuGetのパッケージの構成が変わっていたのと、ネームスペースからMicrosoft.Practicesが消えているので(いつの間にかオープンソースになっている)ちょっと戸惑いましたが、思ったより分かりやすい構造でした。
親のXAML(Shell.xaml)にregionを追加してそこに表示するモジュールはIModule型で作成。
利用可能なModuleの一覧(ModuleCatalog)にModuleを追加する方法には、コード、XAML、config、特定のディレクトリに入れる等あり。
権限(人)単位で制御するにはコードで、インストール場所単位で制御するにはディレクトリにポンが楽そう。
モジュールをどの場所(region)に表示するかを制御するのがRegionManager。
モジュールのコンストラクタがRegionManagerのインスタンスを受け取るので、モジュール側から自分の表示場所を指定できる。
親を変更しなくても、モジュールを追加したり、表示場所を変更したりできそう。
なかなかいい感じ。
作成手順
Task 1:Prismライブラリを利用するソリューションを作成
- 新規プロジェクトの作成(テンプレート:WPF Application、プロジェクト名:HelloWorld.Desktop)
- NuGetでPrismライブラリ追加(Prism 6 for WPFとUnity for Prism 6。Prism 6 for WPFとなっているのはXamarin用やWindows 10 UWP用ができているためと思われます。ちょっと気になりますが、ここは横道にそれずにまずWPFで)
- MainWindow.xamlのファイル名をShell.xamlに変更(最近のテンプレートやサンプルではMainWindowのままになっています)
- リファクタリング機能を使ってMainWindowのClass名もShellに変更
- Shell.xamlのルートタグ(Window)に xmlns:prism="http://www.codeplex.com/prism" を追加、TitleをMainWindowからHello Worldに変更
- Gridタグを消して<ItemsControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion"/>に置き変える
- UnityBootstrapperを継承するBootstrapperクラスを追加。using 部分はそのままだとエラーになるので、下記に修正。
using System.Windows; using Prism.Modularity; using Prism.Unity; using Microsoft.Practices.Unity;
- App.csでOnStartupを上書きし、Bootstrapperを実行するように変更。不要になったApp.xaml ファイルの StartupUri 属性を削除)。実行してShell.xamlが呼ばれることを確認
Task 2:モジュールを追加する
- モジュール側の新規プロジェクトを追加(テンプレート:Class Library、プロジェクト名:HelloWorldModule)
- 参照を追加
- PresentationCore.dll
- PresentationFramework.dll
- WindowsBase.dll
- System.Xaml.dll
- Prism関連の参照を追加(親プロジェクトのNugetの管理画面から)
- Class1.cs のファイル名を HelloWorldModule.csに変更(クラス名も連動して変える)。
- using Prism.Modularity; を追加
- IModuleを継承
- 空のInitialize メソッドを追加
- フォルダを3つ(Services、ViewModels、Views)追加
- 親プロジェクトからモジュールのプロジェクトを参照し、BootstrapperのConfigureModuleCatalogメソッドでHelloWorldModuleをModuleCatalogに追加
- ビルドして実行。見た目は変わらないけれど、HelloWorldModuleのInitializeメソッドが呼ばれていることが分かる。
Task 3: Viewを追加
- ViewsフォルダにHelloWorldView.xamlを追加
- Gridタグ内にTextBlockを追加し、Textや見た目を変更
- HelloWorldModule.csにusing Prism.Regions;を追加
- region managerへの参照を保存するフィールド変数作成
- コンストラクタで受け取ったregion managerのインスタンスを上で作った変数に保存
- 上で作った空のInitializeメソッドでregion managerのRegisterViewWithRegionメソッドを使ってShell.xamlのMainRegionとViewsフォルダのHelloWorldView.xamlを紐付ける
- ビルドして実行すると、HelloWorldView.xamlの内容が表示される