※サンプルコードのダウンロードは、原文リンクから行ってください。
パターンと実践 ディベロパー・センター
UI Composition QuickStart Using the Prism Library 5.0 for WPF(原文)
Microsoft Prism Library 5.0 for WPFの開発者のガイドから:
UI構成のQuickStartのサンプルは、WPFのためのPrismライブラリとユーザー・インターフェイス(UI)構成のための、 View発見とView注入アプローチの両方を、どのように、使用するかを説明します。View発見を使用するとき、 モジュールは、それぞれの名前を付けた場所に対して、View(あるいは、プレゼンテーションModel)を登録することができます。 その場所が、実行時に表示されるとき、どんなViewでも、その場所が、作成され、表示されるために、登録されています。 View注入の方法では、Viewは、プログラムで、それらを管理するモジュールで、名前を付けた場所から、追加、あるいは、削除されます。 これを使用可能にするために、アプリケーションには、UIの名前を付けた場所のレジストリが含まれています。 そして、モジュールは、レジストリを使用している1つの場所を探すことができます。 そして、その次に、プログラム上で、それにViewを注入します。
実際の使い方
Business Scenario
UI構成のQuickStartは、架空のリソース管理システムに基づいています。 メイン・ウィンドウは、より大規模なシステムのサブセットを示しています。 このウィンドウの中で、ユーザーは、企業の従業員について、連絡先を更新し、 そして、各々の従業員が割り当てられているプロジェクトを調査し、詳細な情報を再検討することができます。 次に示す図は、QuickStartのメイン・ウィンドウを示しています。
UI構成のクイックスタート
UI Composition QuickStart
QuickStartを構築して、そして、実行する
Building and Running the QuickStart
このQuickStartは、実行するために、Visual Studio 2012、あるいは、それ以後と.NET Framework 4.5.1を必要とします。
QuickStartを構築して、実行するには、
To build and run the QuickStart
- Visual Studioでは、ソリューション・ファイルQuickStarts\UIComposition_Desktop \UICompositionQuickstart_Desktop.slnを開きます。
- Buildメニュー内で、Rebuild Solutionをクリックします。
- QuickStartを実行するために、F5を押してください。
実装上の注意
Implementation Notes
QuickStartは、アプリケーションの主要な実装の詳細を強調しています。それは、領域を使用しています。 View発見とView注入の両方を使用して、構成にアプローチします。次の図は、アプリケーションの主要な成果物を示しています。
UI構成のQuickStartの概念ビュー
UI Composition QuickStart conceptual view
次の成果物は、前述の図の中で説明されています。:
- Shellビュー。これは、アプリケーションのメイン・ウィンドウです。このウィンドウには、左と中心となる領域が含まれています。
- 左の領域。この領域には、View発見を通じて、従業員のリストが含まれる、Viewが含まれています。
- 従業員リストのView。このViewは、従業員のリストを表示します。
- 中心となる領域。この領域は、それに注入される、従業員概要Viewを持っています。
- 従業員概要View。このViewは、従業員のための情報を表示し、そして、タブ領域が含まれています。それは、View注入によって、アプリケーションに追加されます。
- Tab領域。タブ領域は、従業員の概要Viewが存在します。そして、従業員の詳細が、あります。そして、プロジェクト・ビューは、View発見によって追加されます。
- 従業員詳細ビュー。このViewは、選択された従業員についての詳細を表示します。
- 従業員プロジェクト・ビュー。このViewは、従業員が作業しているプロジェクトのリストを表示します。
備考
QuickStartには、コードで重要な概念を案内するのを助けるために、ToDoコメントが、含まれています。 Visual Studioで、Task Listウィンドウを使用するには、コードのこれらの重要な領域のリストを参照してください。 Commentsが、Task Listウィンドウのドロップダウン・ボックス内で選択されるていることを確認します。 あなたが、リスト内の項目をダブルクリックする場合、コード・ファイルは、該当する行で開きます。
ユーザー・インターフェイスを構成する
Composing the User Interface
UI構成のQuickStartは、1つのアプリケーション内で、View発見とView注入の両方を紹介します。
領域は、XAMLコードで構成されます:
- Shellは、ShellView.xaml内のLeftRegionとMainRegionの2つの領域を定義します。
- EmployeeSummaryViewには、EmployeeSummaryView.xaml内で、TabRegionという名前の領域を定義するTabコントロールが含まれています。
- TabRegionは、また、EmployeeSummaryView.xaml内で、すべての子Viewに、現在選択された従業員への参照を提供するRegionContextを定義します。
アプリケーションは、次の方法で、どんな、ビューを表示するかを決定します。:
- App.xaml.csのOnStartupメソッドは、クイックスタートのブートストラッパーを作成し、そして、実行します。
- ブートストラッパーのConfigureModuleCatalogメソッドで、モジュール・カタログが、読み込まれます。 このモジュール・カタログは、ModuleInitクラス内の1つのEmployeeModuleを定義します。 それは、それが利用可能になるとすぐにPrismによって読み込まれます。
- EmployeeModuleで、ModuleInitクラスのInitializeメソッドは、ブートストラッパーによって呼び出されます。 このメソッドは、いろいろなことを行います。IEmployeeDataService(従業員データのリポジトリー)を登録することが含まれています。 そして、MainRegionControllerのインスタンスを作成します。 ラムダ式を使用して、また、Initializeメソッドは、View発見の一例として、LeftRegionと一緒にEmployeeListView、 そして、TabRegionと一緒にEmployeeDetailViewとEmployeeProjectsViewの両方を登録します。 ここで重要な点は、これらの領域は、作成されません。
- ブートストラップ工程の少し後で、ブートストラッパーのCreateShellメソッドが、呼び出されます。 LeftRegionとMainRegionが含まれているShellViewのインスタンスを作成します。
- LeftRegionを作成する工程において、Prismは、Viewが領域に登録されることを決定します。 そして、EmployeeListViewのインスタンスを作成するために、登録されたラムダ式を使用します。 このViewは、アクティブにされて、表示されます。
- なぜなら、MainRegionで登録されたViewがありません。ここでは、何も、表示されません。
従業員が、EmployeesListViewから選択されるとき、次のことが、発生します。:
- MainRegionControllerのEmployeeSelectedメソッドが、呼び出されます。 EventAggregatorを通して、EmployeeSelectedEventのイベントを購読するため、 このイベントは、EmployeeListViewModelクラスでSelectedEmployeeChangedメソッドによって公開されています。
EmployeeSelectedメソッドでは、次のことが、発生します。:
- 選択された従業員は、EmployeeDataServiceから取り出されます。
- MainRegionは、RegionManagerから取り出されます。 そして、メソッドは、EmployeeSummaryViewという名前のViewを捜し出そうとします。 このViewは、作成されなかったため、それは、コンテナからインスタンスを取り出し、 そして、明示的に、MainRegionにViewを注入し、View注入を表示します。
-
EmployeeSummaryViewが作成されるとき、また、それが含まれるTabRegionが、作成されます。
- この領域は、(EmployeeViewSummary.xaml内の)CurrentEmployeeに結合されるRegionContextを持っています。 これが発生すると、いくつかの他のことが、発生します。:
- Prismは、TabRegionが、それに登録された複数のビューを持つことを、決定します。 そして、それは、EmployeeDetailsViewとEmployeeProjectsViewのインスタンスを作成し、 それらを表示し、View発見のもう一つの例を示します。 これらのViewの両方は、RegionContextのPropertyChangedイベントを購読します。
- RegionContext上の結合は、更新されます。そして、PropertyChangedイベントが起動します。
- EmployeeDetailsViewとEmployeeProjectsViewの両方は、RegionContextプロパティの変更を知らせます。 そして、関連するView Modelは、更新され、現在の従業員の表示が発生します。
View発見とView注入を適用する
Applying View Discovery and View Injection
View発見アプローチは、モジュールがコレクションの対を格納するレジストリに基づいて、 (View型、領域の名前のような)領域の内側のビューを取り出す事ができます。 このレジストリは、RegionViewRegistryという名前です。 領域が作成されるとき、それは、RegionViewRegistry内の、その領域の名前に関連する、すべてのView型を探します。 対応するViewが、作成され、そして、領域に取り出します。 この方法を使用するとき、領域のインスタンスは、Viewを作成する名前によって、 そして、それを注入する領域を明示的に見つける必要はありません。
一般的に、他のViewを格納するViewは、その子Viewが、利用できる必要がある前後関係があります。 例えば、あなたが、その詳細を表示するために、従業員を選択するためのビューを持っている場合、 従業員が、現在、選択されている動的に読み込んだ子Viewは、おそらく、知っている必要があります。
View注入アプローチは、すでに存在する領域にViewを押し込むことができます。これは、Viewのインスタンスを作成することが必要です。 領域に参照を取得します。そして、RegionViewRegistry内で2つを関連付けるために、領域のAddメソッドを使用しています。
一般的に、領域内で、Viewの明示されたコントロールが必要であるとき、 あるいは、表示するViewが、アルゴリズム的に決定されるとき、View注入は使用されます。
View発見アプローチとView注入アプローチとの比較
View Discovery Approach vs. View Injection Approach
- View発見モデルは、タイミングの問題がありません。 例えば、モジュールは、Viewをまだ作成されてないかもしれない領域に追加しようとすることができます。
- 同じ領域の複数のインスタンスを表示することは、より簡単です。 なぜなら、あなたは、Viewを注入する特定の領域インスタンスを見つけるためのスコープの領域マネージャーを知るために、行う必要はありません。
- あなたは、個々の領域で関連付けることができるすべてのViewを取得するために、 GetContentsメソッドを使用して、RegionViewRegistryクラスを問い合わせることができました。 例えば、このリストは、メニューに結合することができます。 View発見構成では、ビジュアル・ツリーに追加されるとすぐに、領域は埋め込まれます。 それで、あなたは、より少ないコントロールを持っています。 Viewが、個々の領域に追加されるとき、 あなたが、一定の時間に、Viewを読み込むことを望む場合、View発見構成で、これを達成することは、難しいでしょう。
- あなたが、同時に、領域が含まれている同じViewの複数のインスタンスを持っているような、スコープの領域管理者を必要とする場合、 View発見構成を使用してはいけません。領域が、領域マネージャーで登録されているため、名前は一意である必要があります。
Viewの登録する
Registering Views
Prism LibraryのRegionViewRegistryクラスは、登録と(領域の名前、View型)対を取り出す役割を果たします。 一般的に、アプリケーション・モジュールは、RegionViewRegistryインスタンスを使用して、 それらのInitializeメソッド内で、それらのViewを登録します。 次のコード例は、EmployeeModuleモジュール内のModuleInitクラスのInitializeメソッドで、 LeftRegionと一緒にEmployeeListViewの登録を表示します。
C#
this.regionManager.RegisterViewWithRegion(
RegionNames.LeftRegion,
() => this.container.Resolve<EmployeeListView>());
Prism LibraryのRegionViewRegistryクラスが使用されるRegisterViewWithRegionメソッドは、 レジストリ内で、その関連するViewに領域の名前を登録します。このメソッドを呼び出すために、2つの方法があります。:
- 直接、RegionViewRegistryから、
- そのクラスの拡張メソッドの簡単なアクセスのため、RegionManagerインスタンスから、
備考
この拡張メソッドは、簡単にアクセスするために、RegionManagerの上にあります。 しかし、それは、一つの領域管理者のそのインスタンスだけで、Viewを登録しません。 指定された名前を持つ領域が作成されるとき、スコープの領域管理者が登録されているかに関係なく、Viewは、それに取り出します。
RegisterViewWithRegionメソッドは、2つのオーバーロードを持っています。:
あなたが、直接、Viewを登録したい場合、最初のオーバーロードを使用します。 あなたが、プレゼンターを解決するような、デリゲートを提供したい場合、2つ目のオーバーロードを使用する以前のInitializeメソッドに見られるように 、「presenter first」や「ViewModel-first」アプローチで、Viewを作成するための役割を果たします。
領域が作成されるとき、それは、レジストリ内で関連するViewを探します。 対応するViewが、引き出され、そして、領域内に、読み込まれます。 最初のオーバーロードが使用される場合、Viewの新しいインスタンスは、Service Locatorを使用して作成されます。
Viewの間でコンテキストを共有する
Sharing Context Between Views
あなたが、その子Viewの領域に格納する親Viewからコンテキストを共有したい場合、RegionContext添付プロパティは役に立ちます。 この添付プロパティは、どんな簡単、あるいは、複雑なオブジェクトでも格納することができます。
UI構成のQuickStartでは、RegionContextは、選択された従業員が作業したプロジェクトを取得するために、 選択された従業員IDを、ProjectListView Viewに渡すために使用されます。
次のコードは、EmployeesSummaryView.xamlファイルに配置します。 (UIComposition.EmployeeModuleプロジェクトのViewディレクトリ内で)、 RegionContext添付プロパティが、XAMLで使用される方法を表示します。
XAML
<TabControl Grid.Row="1"
AutomationProperties.AutomationId="EmployeeSummaryTabControl"
Margin="8"
regions:RegionManager.RegionName="TabRegion"
regions:RegionManager.RegionContext="{Binding CurrentEmployee}"
Width="Auto"
Height="Auto"
HorizontalAlignment="Stretch"
ItemContainerStyle="{StaticResource HeaderStyle}">
</TabControl>
次のコードの例に示すように、ViewのRegionContextを得るために、 RegionContextクラスのGetObservableContext staticメソッドは、使用されます。 それは、パラメータとしてViewを渡し、そして、そのValueプロパティにアクセスします。
C#
// EmployeeDetailsView.xaml.cs
employeeDetailsViewModel.CurrentEmployee =
RegionContext.GetObservableContext(this).Value as Employee;
単純に、新しい値を、そのValueプロパティに割り当てることによって、RegionContextの値を、変更することができます。 また、RegionContextプロパティが変更されるとき、あなたは、検出するために、イベントを購読することができます。 次のコードの例に示すように、それは、そのPropertyChangedイベントを、RegionContextChangedイベントハンドラに購読します。
備考
DataContextプロパティは、コンテキストを共有するために使用されません。 なぜなら、DataContextプロパティは、一般的に、ViewのView Modelを格納するために使用されます。
受入検査
Acceptance Tests
UI構成のQuickStartには、分離したソリューションが含まれています。それには、受入検査が含まれています。 受入検査では、あなたが、一連の手順に従うとき、アプリケーションが、どのように動作する必要があるかを説明します。 あなたは、さまざまな使い方をする、アプリケーションの機能の挙動を調べるために、受入検査を使用することができます。
UI構成のQuickStartの受入検査を実行するには
To run the UI Composition QuickStart acceptance tests
- Visual Studioでは、ソリューション・ファイルQuickStarts\UIComposition_Desktop\UIComposition.Tests.AcceptanceTest\UIComposition.Tests.AcceptanceTest.slnを開きます。
- ソリューションを構築します。
- Test Explorerを開きます。
- ソリューションを構築した後、Visual Studioは、テストを捜し出します。受入検査を実行するために、Run Allボタンをクリックします。
結論
Outcome
あなたは、ウィンドウのQuickStartを参照する必要があります。 そして、テストは、自動的に、アプリケーションと相互作用します。 テストが渡された最後に、あなたは、すべてのテストが渡されたことを確かめる必要があります。
詳細情報
More Information
UIの構成の詳細については、ユーザー・インターフェイスを構築するを参照してください。
Prismに含まれる、他のコードサンプルについて学ぶためには、次のトピックを参照してください。: