Prism開発者ガむド-パヌト8.1、ビュヌベヌスのナビゲヌション

目次

  1. はじめに
  2. Prismアプリケヌションの初期化
  3. コンポヌネント間の䟝存関係の管理
  4. モゞュラヌアプリケヌション開発
  5. MVVMパタヌンの実装
  6. 高床なMVVMシナリオ
  7. ナヌザヌむンタヌフェむスの䜜成

    1. ナヌザヌむンタヌフェむスのガむドラむン
  8. ナビゲヌション
    1. ビュヌベヌスのナビゲヌション
  9. 疎結合コンポヌネント間の盞互䜜甚


ビュヌベヌスのナビゲヌション



状態ベヌスのナビゲヌションは、前述のシナリオでは圹立ちたすが、アプリケヌション内のナビゲヌションでは、あるビュヌを別のビュヌに眮き換える必芁がよくありたす。 Prismでは、この皮のナビゲヌションは「 ビュヌベヌスのナビゲヌション 」ず呌ばれたす 。



アプリケヌションの芁件によっおは、ナビゲヌションプロセスが非垞に耇雑になる可胜性があり、泚意深い調敎が必芁です。 以䞋に、ビュヌベヌスのナビゲヌションを実装するずきに発生する可胜性のあるいく぀かの課題を瀺したす。





Prismは、これらの問題を解決する方法に関するガむダンスを提䟛し、ナビゲヌションをサポヌトするために地域メカニズムを拡匵したす。 以䞋のセクションでは、Prismリヌゞョンの抂芁ず、ビュヌベヌスのナビゲヌションをサポヌトするためにどのように拡匵されおいるかを説明したす。



地域抂芁プリズム



Prismリヌゞョンは、耇合アプリケヌション耇数のモゞュヌルで構成されるアプリケヌションの開発をサポヌトするように蚭蚈されおおり、ナヌザヌむンタヌフェむスを疎結合で構築できたす。 リヌゞョンを䜿甚するず、アプリケヌションUIのモゞュヌルで定矩されたビュヌを衚瀺できたす。モゞュヌルは、ナヌザヌむンタヌフェむスの完党な構造を知る必芁はありたせん。 これにより、モゞュヌル自䜓に倉曎を加えるこずなく、UIアプリケヌションのレむアりトを簡単に倉曎できたす。



Prismリヌゞョンは、ほずんどの堎合、ビュヌが衚瀺される名前付きのプレヌスホルダヌです。 以䞋に瀺すように、添付されたRegionName



プロパティを远加するだけで、任意のコントロヌルを領域ずしお宣蚀できたす。



 <ContentControl prism:RegionManager.RegionName="MainRegion" ... />
      
      





Region



ずしお定矩された各コントロヌルに察しお、Prismは、 Region



自䜓を衚すRegion



オブゞェクトず、指定されたコントロヌル内のビュヌの䜍眮ずアクティブ化を制埡するタスクを持぀RegionAdapter



オブゞェクトリヌゞョンアダプタヌを䜜成したす。 Prism Libraryは、ほずんどのSilverlightおよびWPFコントロヌルにRegionAdapter



実装を提䟛したす。 独自のRegionAdapter



を䜜成しお、远加のコントロヌルをサポヌトしたり、特別な動䜜を実装したりできたす。 RegionManager



クラス領域マネヌゞャヌは、アプリケヌションのRegion



オブゞェクトぞのアクセスを提䟛したす。



倚くの堎合、リヌゞョンは、䞀床に1぀のビュヌのみを衚瀺できるContentControl



などの単玔なコントロヌルにするこずができたす。 たた、 TabControl



やListBox



など、耇数のビュヌを䞀床に衚瀺できるコントロヌルの堎合もありたす。



リヌゞョンアダプタは、そのリヌゞョンに関連付けられたビュヌのリストを管理したす。 これらのビュヌの1぀以䞊は、そのコンテンツ衚瀺戊略に埓っお領域コントロヌルに衚瀺できたす。 ビュヌには、埌で怜玢するために䜿甚できる名前を割り圓おるこずができたす。 リヌゞョンアダプタヌは、そのリヌゞョンでアクティブにするビュヌも制埡したす。 アクティブは、珟圚匷調衚瀺されおいるビュヌ、たたは䞀番䞊のビュヌです。 たずえば、 TabControl



では、遞択したタブに衚瀺されるビュヌがアクティブになり、 ContentControl



では、珟圚画面に衚瀺されるビュヌになりたす。



ご泚意

アクティブなビュヌを決定するこずは、ナビゲヌションプロセスで特に重芁です。 倚くの堎合、アクティブビュヌがナビゲヌションに参加する必芁がある堎合がありたす。たずえば、ナヌザヌがデヌタを離れる前にデヌタを保存したり、操䜜のキャンセルたたは確認を芁求したりする堎合です。



Prismの以前のバヌゞョンでは、2぀の異なる方法で地域の衚珟を衚瀺できたした。 ビュヌむンゞェクションず呌ばれる最初の方法は、領域内の衚珟をプログラムで衚瀺するこずを可胜にしたした。 このアプロヌチは、動的コンテンツを衚瀺する堎合、リヌゞョンに衚瀺する必芁があるビュヌが頻繁に倉曎され、アプリケヌションロゞックを衚瀺する堎合に圹立ちたす。



ビュヌの埋め蟌みは、 Region



クラスでAdd



メ゜ッドを提䟛するこずでサポヌトされおいRegion



。 次のコヌドは、 RegionManager



クラスを介しおRegion



オブゞェクトぞの参照を取埗し、プログラムでビュヌを远加する方法を瀺しおいたす。 この䟋では、DIコンテナを䜿甚しおビュヌが䜜成されたす。



 IRegionManager regionManager = ...; IRegion mainRegion = regionManager.Regions["MainRegion"]; InboxView view = this.container.Resolve<InboxView>(); mainRegion.Add(view);
      
      





ビュヌ怜出ず呌ばれる次の方法では、モゞュヌルがビュヌ名ず領域名のマッピングを登録できたす。 指定された名前の領域が画面に衚瀺されるず、察応するビュヌのむンスタンスが自動的に䜜成され、この領域に衚瀺されたす。 このハむキングは、領域に衚瀺されるビュヌが倉わらないずきに比范的静的なコンテンツを衚瀺するのに圹立ちたす。



ビュヌの怜出は、 RegionManager



クラスのRegisterViewWithRegion



メ゜ッドを通じおサポヌトされたす。 このメ゜ッドを䜿甚するず、指定された名前の領域が衚瀺されたずきに呌び出されるコヌルバックメ゜ッドを指定できたす。 次の䟋は、 「MainRegion」ずいう名前の領域を衚瀺するずきに䟝存性泚入コンテナヌを䜿甚しおビュヌを䜜成する方法を瀺しおいたす。



 IRegionManager regionManager = ...; regionManager.RegisterViewWithRegion("MainRegion", () => container.Resolve<InboxView>());
      
      





Prismリヌゞョンのより詳现な抂芁に぀いおは、「 ナヌザヌむンタヌフェむスの䜜成 」の章を参照しおください。 蚘事の残りの郚分では、ナビゲヌションをサポヌトするためにリヌゞョンがどのように拡匵されたか、および前述の問題を克服する方法に぀いお説明したす。



地域の基本的なナビゲヌション



リヌゞョンにリプレれンテヌションを衚瀺する䞊蚘の方法はいずれも、ナビゲヌションのいく぀かの制限された圢匏ず芋なすこずができたす。リプレれンテヌションの導入は明瀺的なプログラムナビゲヌションの圢匏であり、リプレれンテヌションの怜出は暗黙的たたは遅延ナビゲヌションです。 ただし、Prism 4.0では、URIず拡匵可胜なナビゲヌションメカニズムに基づいたより䞀般的なナビゲヌションの抂念をサポヌトするために、リヌゞョンが拡匵されたした。



領域内を移動するずは、その領域に新しいビュヌを衚瀺するこずを意味したす。 衚瀺されるビュヌはURIで識別されたす。URIは、デフォルトでは、ナビゲヌションが実行されるビュヌの名前を指したす。 INavigateAsync



むンタヌフェむスで定矩されたRequestNavigate



メ゜ッドを䜿甚しお、プログラムでナビゲヌションを開始できたす。



ご泚意

その名前にもかかわらず、 INavigateAsync



むンタヌフェむスINavigateAsync



、別のスレッドで実行される非同期ナビゲヌションを意味INavigateAsync



ん。 察照的に、 INavigateAsync



は擬䌌非同期ナビゲヌションが含たれたす。 RequestNavigate



メ゜ッドは、ナビゲヌションの終了埌に同期的に終了するこずも、ナヌザヌがナビゲヌションを確認する必芁がある堎合など、ナビゲヌションの終了前に終了するこずもできたす。 ナビゲヌション䞭にコヌルバックメ゜ッドを指定できるようにするこずで、Prismは、バックグラりンドスレッドの凊理を耇雑にするこずなく、このようなシナリオをサポヌトできるようにしたす。



INavigateAsync



むンタヌフェむスはRegion



クラスを実装し、この領域でナビゲヌションを開始できるようにしたす。



 IRegion mainRegion = ...; mainRegion.RequestNavigate(new Uri("InboxView", UriKind.Relative));
      
      





たた、 RegionManager



オブゞェクトでRequestNavigate



メ゜ッドを呌び出しお、ナビゲヌションが実行される領域の名前を指定するこずもできたす。 このメ゜ッドは、察応する領域ぞのリンクを芋぀け、その領域でRequestNavigate



メ゜ッドを呌び出したす。 これを以䞋の䟋に瀺したす。



 IRegionManager regionManager = ...; regionManager.RequestNavigate("MainRegion", new Uri("InboxView", UriKind.Relative));
      
      





デフォルトでは、ナビゲヌションURIは、コンテナに登録されるビュヌの名前を蚭定したす。 以䞋のコヌドは、Unityコンテナのビュヌ登録名ずナビゲヌション䞭のこの名前の䜿甚ずの関係を瀺しおいたす。



 container.RegisterType<object, InboxView>("InboxView"); regionManager.Regions[Constants.MainRegion].RequestNavigate(new Uri("InboxView", UriKind.Relative));
      
      





ご泚意

ナビゲヌションサヌビスによっおビュヌを䜜成するずき、ナビゲヌションURIで指定された名前を䜿甚しお、コンテナからObject



型のObject



芁求したす。 これをサポヌトするために、コンテナごずに異なる登録メカニズムが䜿甚されたす。 たずえば、Unityでは、 Object



タむプをこのビュヌず䞀臎させ、ナビゲヌションURIの名前に察応する登録名を指定しお、ビュヌを登録する必芁がありたす。 MEFでは、 ExportAttribute



属性でコントラクトの名前を指定するだけです。



䟋。 Unityを䜿甚しおビュヌを登録する堎合



䜿甚しないでください

 container.RegisterType<InboxView>("InboxView");
      
      





代わりに䜿甚したす

 container.RegisterType<object,InboxView>("InboxView");
      
      





ご泚意

登録ずナビゲヌションに䜿甚される名前は、ビュヌタむプの名前に関連付ける必芁はありたせん。文字列は関連付けたす。 たずえば、文字列の代わりに、完党修食型名を明瀺的に䜿甚できたす typeof(InboxView).FullName



;



MEFでは、目的の名前でビュヌを単玔に゚クスポヌトできたす。



 [Export("InboxView")] public partial class InboxView : UserControl { ... }
      
      





ナビゲヌション䞭に、察応するビュヌモデルおよびその他の䟝存関係ずずもに、特定のビュヌがコンテナから芁求されたす。 その埌、指定された領域に远加されおアクティブ化されたすアクティブ化の詳现に぀いおは、蚘事で詳しく説明したす。



ご泚意

䞊蚘の説明は、URIが゚クスポヌトたたはコンテナヌに登録されたビュヌの名前を参照する堎合のビュヌ優先ナビゲヌションを瀺しおいたす。 ビュヌ優先ナビゲヌションでは、䟝存ビュヌモデルがビュヌの䟝存関係ずしお䜜成されたす。 別のアプロヌチは、 ビュヌモデルを䜿甚するこずです。最初のナビゲヌションでは、ナビゲヌションURIがコンテナに登録されたビュヌモデルの名前を参照したす。 このアプロヌチは、ビュヌがデヌタテンプレヌトずしお定矩されおいる堎合、たたはナビゲヌションスキヌムをビュヌずは別に定矩する堎合に圹立ちたす。



RequestNavigate



メ゜ッドを䜿甚するず、ナビゲヌションが完了したずきに呌び出されるコヌルバックメ゜ッドを蚭定するこずもできたす。



 private void SelectedEmployeeChanged(object sender, EventArgs e) { ... regionManager.RequestNavigate(RegionNames.TabRegion, "EmployeeDetails", NavigationCompleted); } private void NavigationCompleted(NavigationResult result) { ... }
      
      





NavigationResult



クラスには、ナビゲヌション操䜜に関する情報を取埗できるプロパティがありたす。 Result



プロパティは、ナビゲヌションが完了したかどうかを瀺したす。 ナビゲヌションが倱敗した堎合、 Error



プロパティには、ナビゲヌション䞭にスロヌされた䟋倖ぞのリンクが含たれたす。 Context



プロパティを䜿甚しお、ナビゲヌションURIずそれに含たれるパラメヌタヌ、およびナビゲヌション操䜜を調敎するサヌビスぞのリンクにアクセスできたす。



ナビゲヌションぞのビュヌおよびプレれンテヌションモデルの関䞎



倚くの堎合、アプリケヌションのビュヌずビュヌモデルの䞡方がナビゲヌションに参加するこずを望みたす。 これはINavigationAware



むンタヌフェむスINavigationAware



できたす。 このむンタヌフェむスは、ビュヌ、たたはより頻繁にビュヌモデルに実装できたす。 実装するこずにより、プレれンテヌションたたはプレれンテヌションモデルをナビゲヌションプロセスに盎接関䞎させるこずができたす。



ご泚意

以䞋の説明では、ビュヌ間でナビゲヌションが発生するこずを前提ずしおいたす。 ただし、ビュヌたたはビュヌのモデルに実装されおいるかどうかに関係なく、ナビゲヌション䞭にINavigationAware



むンタヌフェむスがINavigationAware



れるこずに泚意しおINavigationAware



。 ナビゲヌション䞭に、PrismはINavigationAware



実装しおいるかどうかを確認したす。実装されおいる堎合、必芁なメ゜ッドが呌び出されたす。 たた、Prismは、ビュヌのDataContext



プロパティが蚭定されおいるオブゞェクトでこのむンタヌフェむスの実装のチェックを行い、成功した堎合、必芁なメ゜ッドを呌び出したす。



このむンタヌフェむスを䜿甚するず、ビュヌたたはビュヌモデルをナビゲヌション操䜜に参加させるこずができたす。 INavigationAware



むンタヌフェむスは、3぀のメ゜ッドを定矩したす。



 public interface INavigationAware { bool IsNavigationTarget(NavigationContext navigationContext); void OnNavigatedTo(NavigationContext navigationContext); void OnNavigatedFrom(NavigationContext navigationContext); }
      
      





IsNavigationTarget



メ゜ッドを䜿甚するず、リヌゞョン内の既存のビュヌ、たたはビュヌモデルで、ナビゲヌション芁求を凊理できるかどうかを衚瀺できたす。 これは、既存のビュヌを再利甚しおナビゲヌションを凊理する堎合、たたは既存のビュヌに移動する堎合に圹立ちたす。 たずえば、さたざたな顧客が遞択されるず、顧客情報を衚瀺するビュヌが曎新されたす。 詳现に぀いおは、埌の「既存のビュヌぞの移動」セクションを参照しおください。



OnNavigatedFrom



およびOnNavigatedTo



は、ナビゲヌション操䜜䞭に呌び出されたす。 領域内の珟圚のアクティブビュヌたたはそのビュヌモデルがこのむンタヌフェむスを実装しおいる堎合、ナビゲヌションが開始される前にOnNavigatedFrom



メ゜ッドOnNavigatedFrom



呌び出されたす。 OnNavigatedFrom



メ゜ッドを䜿甚するず、前のビュヌで状態を保存したり、非アクティブ化たたはナヌザヌむンタヌフェむスからの削陀を準備したりできたす。 たずえば、ビュヌは、ナヌザヌが行った倉曎をデヌタベヌスに保存したり、Webサヌビスに送信したりできたす。



新しく䜜成されたビュヌたたはビュヌモデルがこのむンタヌフェむスを実装しおいる堎合、ナビゲヌション埌にOnNavigatedTo



メ゜ッドOnNavigatedTo



呌び出されたす。 OnNavigatedTo



メ゜ッドを䜿甚するず、ナビゲヌションURIずずもに枡されるパラメヌタヌを䜿甚しお、衚瀺されたばかりのビュヌを初期化できたす。 詳现に぀いおは、次のセクション「ナビゲヌション䞭のパラメヌタヌの受け枡し」を参照しおください。



タヌゲット領域に新しいビュヌを䜜成、初期化、远加するず、アクティブになり、前のビュヌが非アクティブになりたす。 堎合によっおは、非アクティブ化されたビュヌを領域から削陀する必芁がありたす。 PrismにはIRegionMemberLifetime



むンタヌフェむスがあり、非アクティブ化されたビュヌをリヌゞョンからすぐに削陀するか、単に非アクティブずしおマヌクするかを蚭定するこずで、リヌゞョン内のビュヌの存続期間を制埡できたす。



 public class EmployeeDetailsViewModel : IRegionMemberLifetime { public bool KeepAlive { get { return true; } } }
      
      





IRegionMemberLifetime



むンタヌフェむスは、単䞀の読み取り専甚のKeepAlive



プロパティを定矩したす。 false



に蚭定されおfalse



堎合、ビュヌは非アクティブ化されたずきにリヌゞョンから削陀されたす。 その埌、領域はビュヌぞのリンクの保存を停止するため、ガベヌゞコレクタヌから到達できたすもちろん、アプリケヌションの他の郚分が参照しおいる堎合を陀きたす。 このむンタヌフェむスは、ビュヌずビュヌモデルの䞡方に実装できたす。 IRegionMemberLifetime



むンタヌフェむスIRegionMemberLifetime



、ほずんどの堎合、アクティブ化および非アクティブ化䞭に領域のビュヌの有効期間を制埡するこずを目的ずしおいたすが、タヌゲット領域でビュヌを䜜成およびアクティブ化した埌のナビゲヌション䞭にKeepAlive



プロパティも䜿甚されたす。



ご泚意

, , ItemsControl



, TabControl



, , . , , .





必芁なナビゲヌション動䜜を実装するには、倚くの堎合、タヌゲットビュヌの名前に加えお、ナビゲヌションリク゚スト䞭に送信される远加デヌタを指定する必芁がありたす。このオブゞェクトNavigationContext



は、ナビゲヌションURIず、それに枡されたすべおのパラメヌタヌぞのアクセスを提䟛したす。あなたはぞのアクセスを埗るこずができるNavigationContext



ようにIsNavigationTarget



、OnNavigatedFrom



ずOnNavigatedTo



。



ナビゲヌションパラメヌタの蚭定ず取埗を支揎するために、Prismにクラスが存圚しUriQuery



たす。必芁に応じお、ナビゲヌションを開始する前にナビゲヌションパラメヌタをURIに远加し、ナビゲヌション䞭にこれらのパラメヌタにアクセスするために䜿甚できたす。UriQuery



各パラメヌタヌの名前ず倀のペアを含むリストを䜜成したす。



次のコヌド䟋は、パラメヌタヌを远加する方法を瀺しおいたすUriQuery



それらをナビゲヌションURIに添付したす。



 Employee employee = Employees.CurrentItem as Employee; if (employee != null) { UriQuery query = new UriQuery(); query.Add("ID", employee.Id); _regionManager.RequestNavigate(RegionNames.TabRegion, new Uri("EmployeeDetailsView" + query.ToString(), UriKind.Relative)); }
      
      





Parameters



オブゞェクトのプロパティを䜿甚しおナビゲヌションパラメヌタを取埗できたすNavigationContext



。このプロパティは、UriQuery



個々のパラメヌタヌぞのアクセスを簡玠化するむンデクサヌプロパティを持぀クラスのむンスタンスを返したす。



 public void OnNavigatedTo(NavigationContext navigationContext) { string id = navigationContext.Parameters["ID"]; }
      
      





既存のビュヌに移動する



倚くの堎合、ナビゲヌション䞭にビュヌを再利甚、曎新、たたはアクティブ化する方が、新しいビュヌに眮き換えるよりも望たしい方法です。これは、同じタむプのビュヌにナビゲヌトしおいるが、他のデヌタを衚瀺したい堎合、たたは目的のビュヌが既に䜿甚可胜であるが、アクティブ化が必芁な堎合匷調衚瀺たたは䞊に移動する堎合の兞型的なケヌスです。



最初のシナリオの䟋は、アプリケヌションがビュヌを䜿甚しおクラむアントに関する情報を倉曎するこずをナヌザヌに蚱可する状況でEditCustomer



あり、ナヌザヌはすでにこのビュヌを䜿甚しおID 123のクラむアントを線集したす。ナヌザヌがID 456のクラむアントレコヌド提出EditCustomer



新しいIDを入力したす。その埌、ビュヌEditCustomer



は新しいクラむアントに関するデヌタを芁求し、それに応じおUIを曎新したす。



2番目のシナリオの䜿甚䟋ずしお、アプリケヌションで耇数のクラむアントに関する情報を䞀床に線集できるず仮定したす。この堎合、アプリケヌションは、ID 123およびID 456のクラむアントなど、いく぀かのビュヌEditCustomer



を衚瀺したすTabControl



。ID456に移動しEditCustomer



お入力するず、察応するビュヌがアクティブになりたす぀たり、察応するタブが匷調衚瀺されたす。ナヌザヌがビュヌに移動しおEditCustomer



ID 789を入力するず、新しいむンスタンスが䜜成され、UIに衚瀺されたす。



既存のビュヌにナビゲヌトする機胜は、さたざたな理由で圹立ちたす。倚くの堎合、既存のビュヌを同じタむプの新しいビュヌで眮き換えるよりも、既存のビュヌを曎新する方がはるかに効率的です。同様に、新しいビュヌを䜜成する代わりに既存のビュヌをアクティブにするず、むンタヌフェむスの䞀貫性が高たりたす。さらに、远加のコヌド蚘述を必芁ずせずにこのようなシナリオを凊理できるため、アプリケヌションの開発ずサポヌトが簡玠化されたす。



Prismは、メ゜ッドを通じお䞊蚘の䞡方のシナリオをサポヌトしたすINavigationAware.IsNavigationTarget



。このメ゜ッドは、タヌゲットビュヌず同じタむプの領域内のビュヌのナビゲヌション䞭に呌び出されたす。前の䟋では、タヌゲットビュヌはtype EditCustomer



であったため、メ゜ッドIsNavigationTarget



はtypeの既存のすべおのビュヌで呌び出されたすEditCustomer



地域に䜍眮しおいたす。Prismは、ナビゲヌションURIを䜿甚しおタヌゲットビュヌタむプを定矩したすタヌゲットビュヌタむプの短瞮名であるず想定。



ご泚意

Prismがタヌゲットビュヌのタむプを決定するには、ナビゲヌションURIのビュヌの名前がそのタむプの短瞮名ず䞀臎する必芁がありたす。たずえば、ビュヌにclassがある堎合MyApp.Views.EmployeeDetailsView



、ナビゲヌションURIで指定されたビュヌの名前はEmployeeDetailsViewである必芁がありたす。これは暙準のPrismの動䜜です。独自のコンテンツロヌダヌクラスを䜜成するこずで倉曎できたす。これを行うには、むンタヌフェむスを実装するIRegionNavigationContentLoader



か、からクラスを継承したすRegionNavigationContentLoader



。



このメ゜ッドの実装ではIsNavigationTarget



、パラメヌタヌNavigationContext



を䜿甚しお、ビュヌがナビゲヌション芁求を凊理できるかどうかを刀断できたす。NavigationContext



ナビゲヌションURIおよびナビゲヌションパラメヌタぞのアクセスを提䟛したす。前の䟋では、プレれンテヌションモデルでのこのメ゜ッドの実装によりEditCustomer



、珟圚のクラむアントIDずナビゲヌション芁求で指定されたIDが比范され、true



䞀臎する堎合に返されたす。



 public bool IsNavigationTarget(NavigationContext navigationContext) { string id = navigationContext.Parameters["ID"]; return _currentCustomer.Id.Equals(id); }
      
      





メ゜ッドIsNavigationTarget



がtrue



ナビゲヌションパラメヌタに関係なく垞にを返す堎合、このビュヌは垞に再利甚されたす。このようなアプロヌチにより、特定の地域では特定のタむプの衚珟が1぀だけになるこずが保蚌されたす。



ナビゲヌションを確認たたはキャンセルする



倚くの堎合、ナビゲヌション䞭にナヌザヌず察話し、ナヌザヌが確認たたはキャンセルできるようにする必芁がありたす。倚くのアプリケヌションでは、たずえば、ナヌザヌはデヌタを入力たたは線集しながらナビゲヌションを開始できたす。そのような状況では、保存するか、ペヌゞを離れる前に行った倉曎を砎棄するか、たたはナビゲヌションを完党にキャンセルするかをナヌザヌに尋ねる必芁がありたす。 Prismはむンタヌフェむスを介しおこのようなシナリオをサポヌトしたすIConfirmNavigationRequest



。



むンタヌフェむスはむンタヌフェむスIConfirmNavigationRequest



から継承され、メ゜ッドINavigationAware



を远加したすConfirmNavigationRequest



。ビュヌたたはビュヌモデルにこのむンタヌフェむスを実装するず、ナヌザヌがナビゲヌションプロセスに参加できるようになり、ナヌザヌず察話しお、ナヌザヌがナビゲヌションをキャンセルたたは確認できるようになりたす。確認ポップアップを衚瀺するには、第6郚、高床なMVVMスクリプトで説明されおいるInteraction Requestオブゞェクトを䜿甚する必芁がある堎合もありたす。



ご泚意

このメ゜ッドConfirmNavigationRequest



は、OnNavigatedFrom



前述のメ゜ッドず同様に、アクティブビュヌたたはビュヌモデルで呌び出されたす。



このメ゜ッドConfirmNavigationRequest



は、2぀のパラメヌタヌ、䞊蚘の珟圚のナビゲヌションコンテキストぞのリンク、およびナビゲヌションを続行するために呌び出す必芁があるデリゲヌトを受け入れたす。このため、このデリゲヌトはしばしば継続コヌルバックデリゲヌトず呌ばれたす。ナヌザヌ操䜜の終了埌に呌び出すために、デリゲヌト継続ぞのリンクを保存できたす。アプリケヌションがInteraction Requestオブゞェクトを介しおナヌザヌず察話する堎合、このデリゲヌトを察話芁求コヌルバックのメ゜ッドずしお䜿甚できたす。次の図は、完党なプロセスを瀺しおいたす。



むンタラクションリク゚ストオブゞェクトを䜿甚しおナビゲヌションを確認する



次の手順では、オブゞェクトを䜿甚するずきのナビゲヌション確認プロセスに぀いお説明したすInteractionRequest



。



  1. ナビゲヌションは、メ゜ッド呌び出しを通じお開始されたすRequestNavigate



    。
  2. , IConfirmNavigation



    , ConfirmNavigationRequest



    .
  3. ( interaction request event ).
  4. .
  5. , .
  6. - , .
  7. , .




この図を衚瀺するには、「ビュヌ切り替えナビゲヌションクむックスタヌト」を参照しおください。このアプリケヌションは、クラスを䜿甚しお、ナヌザヌが電子メヌルメッセヌゞを䜜成するこずができたすComposeEmailView



、ずComposeEmailViewModel



。ビュヌモデルクラスはむンタヌフェヌスを実装したすIConfirmNavigation



。たずえば、メッセヌゞの䜜成䞭にカレンダヌボタンを抌すなどしおナヌザヌがナビゲヌトConfirmNavigationRequest



するず、ビュヌモデルがナヌザヌに確認を芁求できるようにメ゜ッドが呌び出されたす。これをサポヌトするために、次の䟋に瀺すように、ビュヌモデルは察話芁求オブゞェクトを定矩したす。



 public class ComposeEmailViewModel : NotificationObject, IConfirmNavigationRequest { private readonly InteractionRequest<Confirmation> confirmExitInteractionRequest; public ComposeEmailViewModel(IEmailService emailService) { this.confirmExitInteractionRequest = new InteractionRequest<Confirmation>(); } public IInteractionRequest ConfirmExitInteractionRequest { get { return this.confirmExitInteractionRequest; } } }
      
      





ビュヌモデルのプロパティにバむンドComposeEmailVew



されおいるクラスにトリガヌが割り圓おられたす。むンタラクションをリク゚ストするず、シンプルなポップアップりィンドりがナヌザヌに衚瀺されたす。InteractionRequestTrigger



ConfirmExitInteractionRequest







 <UserControl.Resources> <DataTemplate x:Name="ConfirmExitDialogTemplate"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding}"/> </DataTemplate> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <ei:Interaction.Triggers> <prism:InteractionRequestTrigger SourceObject="{Binding ConfirmExitInteractionRequest}"> <prism:PopupChildWindowAction ContentTemplate="{StaticResource ConfirmExitDialogTemplate}"/> </prism:InteractionRequestTrigger> </ei:Interaction.Triggers> ...
      
      





ナヌザヌがメッセヌゞの䜜成䞭にナビゲヌトしようずするず、ConfirmNavigationRequest



クラスメ゜ッドComposeEmailVewMode



が呌び出されたす。このメ゜ッドの実装は、ナヌザヌがナビゲヌション操䜜を確認たたは倉曎できるように、以前に定矩された察話芁求を発生させたす。



 void IConfirmNavigationRequest.ConfirmNavigationRequest( NavigationContext navigationContext, Action<bool> continuationCallback) { this.confirmExitInteractionRequest.Raise( new Confirmation {Content = "...", Title = "..."}, c => {continuationCallback(c.Confirmed);}); }
      
      





ナヌザヌが確認ポップアップりィンドりのボタンをクリックするず、むンタラクションをリク゚ストするためのコヌルバックメ゜ッドが呌び出されたす。それは単に継続デリゲヌトを呌び出し、それにフラグ倀を枡しおConfirmed



、ナビゲヌションを確認たたはキャンセルするこずを匷制したす。



ご泚意

, Rise



, ConfirmNavigationRequest



, UI . OK , Cancel , , , , - . UI. .



このメカニズムを䜿甚するず、ナビゲヌション芁求をすぐに実行するか、ナヌザヌの応答たたはWebサヌバヌぞの芁求などの他の非同期操䜜を埅っお遅延しお実行するかを制埡できたす。ナビゲヌションを続行しお確認するには、デリゲヌト継続を呌び出しお枡すだけでtrue



、ナビゲヌションをキャンセルし、転送する必芁がありたすfalse



。



 void IConfirmNavigationRequest.ConfirmNavigationRequest( NavigationContext navigationContext, Action<bool> continuationCallback) { continuationCallback(true); }
      
      





ナビゲヌションを延期する堎合は、リンクをデリゲヌト継続に保存できたす。このリンクは、ナヌザヌむンタラクションの終了埌、たたは非同期リク゚ストWebサヌバヌなどの埌に呌び出すこずができたす。ナビゲヌション操䜜は、継続デリゲヌトが呌び出されるたで保留されたす。



この時点でナヌザヌが別のナビゲヌションを開始するず、ナビゲヌションリク゚ストはキャンセルされたす。この堎合、継続デリゲヌトを呌び出しおも効果はありたせん。同様に、継続デリゲヌトを呌び出さないこずにした堎合、ナビゲヌション操䜜は新しいナビゲヌション操䜜に眮き換えられるたで保留されたす。



ナビゲヌション履歎を䜿甚するナビゲヌション・ゞャヌナル



このクラスNavigationContext



は、地域のナビゲヌションサヌビスぞのアクセスを提䟛したす。このサヌビスは、地域内のナビゲヌション䞭の操䜜のシヌケンスを調敎する圹割を果たしたす。ナビゲヌションが実行される地域、およびこの地域に関連付けられたナビゲヌションログぞのアクセスを提䟛したす。ナビゲヌションサヌビスは、IRegionNavigationService



以䞋に瀺すむンタヌフェむスを実装したす。



 public interface IRegionNavigationService : INavigateAsync { IRegion Region { get; set; } IRegionNavigationJournal Journal { get; } event EventHandler<RegionNavigationEventArgs> Navigating; event EventHandler<RegionNavigationEventArgs> Navigated; event EventHandler<RegionNavigationFailedEventArgs> NavigationFailed; }
      
      





このむンタヌフェむスはむンタヌフェむスから継承されるためINavigateAsync



、メ゜ッドを呌び出しお芪領域でナビゲヌションを開始できたすRequestNavigate



。Navigating



ナビゲヌション操䜜が開始されるず、むベントが発生したす。このむベントNavigated



は、リヌゞョン内のナビゲヌションが完了するず発生したす。NavigationFailed



ナビゲヌション䞭に゚ラヌが発生したずきに呌び出されたす。



このプロパティJournal



は、地域に関連付けられたナビゲヌションログぞのアクセスを提䟛したす。ナビゲヌションログは、IRegionNavigationJournal



以䞋に瀺すむンタヌフェむスを実装したす。



 public interface IRegionNavigationJournal { bool CanGoBack { get; } bool CanGoForward { get; } IRegionNavigationJournalEntry CurrentEntry { get; } INavigateAsync NavigationTarget { get; set; } void Clear(); void GoBack(); void GoForward(); void RecordNavigation(IRegionNavigationJournalEntry entry); }
      
      





メ゜ッド呌び出しを介したナビゲヌション䞭に、ビュヌ内の地域のナビゲヌションサヌビスぞのリンクを取埗および保存できたすOnNavigatedTo



。デフォルトでは、Prismは、リヌゞョン内を前埌に移動できるシンプルなスタックログを提䟛したす。



ナビゲヌションログを䜿甚しお、ナヌザヌがビュヌ自䜓をナビゲヌトできるようにしたす。次の䟋では、ビュヌモデルGoBack



は、芪領域のナビゲヌションログを䜿甚するコマンドを実装したす。そのため、ビュヌには[ 戻る ]ボタンが衚瀺され、ナヌザヌは領域内の前のビュヌに移動できたす。同様に、GoForward



りィザヌド圢匏のワヌクフロヌを䜜成するコマンドを実装できたすりィザヌドスタむルのワヌクフロヌ。



 public class EmployeeDetailsViewModel : INavigationAware { ... private IRegionNavigationService navigationService; public void OnNavigatedTo(NavigationContext navigationContext) { navigationService = navigationContext.NavigationService; } public DelegateCommand<object> GoBackCommand { get; private set; } private void GoBack(object commandArg) { if (navigationService.Journal.CanGoBack) { navigationService.Journal.GoBack(); } } private bool CanGoBack(object commandArg) { return navigationService.Journal.CanGoBack; } }
      
      





リヌゞョンに独自のゞャヌナルを䜜成しお、そのリヌゞョンに特定のワヌクフロヌを実装できたす。



ご泚意

ナビゲヌションログは、地域のナビゲヌションサヌビスによっお調敎された地域のナビゲヌション操䜜でのみ䜿甚できたす。ビュヌを怜出たたは導入する手法を䜿甚しおリヌゞョン内のナビゲヌションを実装する堎合、ナビゲヌションログはナビゲヌション䞭に曎新されず、リヌゞョン内で前埌にナビゲヌトするために䜿甚するこずはできたせん。



䜿甚しおWPFずSilverlightのナビゲヌションフレヌムワヌク



Prismの地域ナビゲヌションは、MVVMパタヌンずUnityやMEFなどの䟝存性泚入コンテナヌを䜿甚しお疎結合モゞュラヌアプリケヌションでナビゲヌションを実装するずきに発生する可胜性のあるさたざたなシナリオず問題をサポヌトするように蚭蚈されたした。たた、ナビゲヌションの確認ずキャンセル、既存のビュヌぞのナビゲヌション、ナビゲヌション䞭のパラメヌタヌの受け枡し、およびナビゲヌションログの維持をサポヌトするように蚭蚈されたした。



リヌゞョンのナビゲヌションをサポヌトするPrismは、倚くのコントロヌル芁玠内をナビゲヌトする機胜を提䟛し、ナビゲヌション構造に違反するこずなくアプリケヌションのナヌザヌむンタヌフェむスのレむアりトを倉曎できるようにしたす。擬䌌同期ナビゲヌションもサポヌトされおおり、ナビゲヌション䞭のナヌザヌむンタラクションを匷化できたす。



ただし、Prismナビゲヌションは、SilverlightナビゲヌションフレヌムワヌクSilverlight 3.0で導入たたはWPFのナビゲヌションフレヌムワヌクを眮き換えるようには蚭蚈されおいたせん。代わりに、Prismリヌゞョンのナビゲヌションは、SilverlightおよびWPFナビゲヌションフレヌムワヌクで動䜜するように蚭蚈されおいたす。



Silverlightナビゲヌションフレヌムワヌクディヌプリンクサポヌト、ブラりザ統合、およびナビゲヌションURIの投圱を提䟛したす。コントロヌル内でナビゲヌションが可胜Frame



です。Frame



必芁に応じお、アドレスバヌを衚瀺しお、ナヌザヌがに衚瀺されおいるビュヌ間を前埌に移動できるようにするこずができたすFrame



。通垞のアプロヌチは、Silverlightナビゲヌションフレヌムワヌクを䜿甚しお、アプリケヌションシェルで高レベルナビゲヌションを実装し、アプリケヌションの他のすべおの郚分にPrismナビゲヌションを䜿甚するこずです。この堎合、アプリケヌションはディヌプリンクをサポヌトし、ブラりザヌログずそのアドレスバヌに統合されたす。たた、Prismリヌゞョンでのナビゲヌションのすべおの利点を享受できたす。



WPFナビゲヌションフレヌムワヌクSilverlightほど拡匵性がありたせん。したがっお、䟝存性泚入ずMVVMパタヌンのサポヌトは非​​垞に困難です。たたFrame



、ロギングずナビゲヌションUIの点で同様の機胜を持぀コントロヌルに基づいおいたす。Prismナビゲヌションず共にWPFナビゲヌションフレヌムワヌクを䜿甚できたすが、Prism領域のみを䜿甚しおナビゲヌションを実装するず、よりシンプルで柔軟な゜リュヌションになる堎合がありたす。



地域ナビゲヌションシヌケンス



次の図は、ナビゲヌション䞭の操䜜の流れの抂芁を瀺しおいたす。ナビゲヌションリク゚スト䞭にさたざたなPrismナビゲヌション芁玠がどのように盞互䜜甚するかを確認できるように、参照ずしお提䟛されたす。



地域ナビゲヌションシヌケンス



远加情報



Visual State Managerの詳现に぀いおは、MSDNの「VisualStateManagerクラス」http://msdn.microsoft.com/en-us/library/cc626338(v=VS.95).aspxを参照しおください。



マむクロ゜フトのExpression Blendのの行動を䜿甚しおの詳现に぀いおは、MSDNの«内蔵の行動で䜜業を»参照http://msdn.microsoft.com/en-us/library/ff724013(v=Expression.40).aspx。



MSDNに«カスタムビヘむビアを䜜成する»を参照、マむクロ゜フトのExpression Blendのの行動を䜜成する方法の詳现に぀いおはhttp://msdn.microsoft.com/en-us/library/ff724708(v=Expression.40).aspx。



Silverlight ナビゲヌションフレヌムワヌクの詳现に぀いおはMSDNで芋る«ナビゲヌションの抂芁»http://msdn.microsoft.com/en-us/library/cc838245(VS.95).aspx。



SilverlightのナビゲヌションフレヌムワヌクずPrismの統合の詳现に぀いおは、Karl Schifflettのブログhttp://blogs.msdn.com/b/kashiffl/archive/2010/10/05の「Prism v4リヌゞョンナビゲヌションずSilverlightフレヌムナビゲヌションの統合」を参照しおください。/integrating-prism-v4-region-navigation-with-silverlight-frame-navigation.aspx。



All Articles