ç®æ¬¡
- ã¯ããã«
- Prismã¢ããªã±ãŒã·ã§ã³ã®åæå
- ã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã®ç®¡ç
- ã¢ãžã¥ã©ãŒã¢ããªã±ãŒã·ã§ã³éçº
- MVVMãã¿ãŒã³ã®å®è£
- é«åºŠãªMVVMã·ããªãª
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæ
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã¬ã€ãã©ã€ã³
- ããã²ãŒã·ã§ã³
- ãã¥ãŒããŒã¹ã®ããã²ãŒã·ã§ã³
- ççµåã³ã³ããŒãã³ãéã®çžäºäœçš
ãã¥ãŒããŒã¹ã®ããã²ãŒã·ã§ã³
ç¶æ
ããŒã¹ã®ããã²ãŒã·ã§ã³ã¯ãåè¿°ã®ã·ããªãªã§ã¯åœ¹ç«ã¡ãŸãããã¢ããªã±ãŒã·ã§ã³å
ã®ããã²ãŒã·ã§ã³ã§ã¯ããããã¥ãŒãå¥ã®ãã¥ãŒã«çœ®ãæããå¿
èŠããããããŸãã Prismã§ã¯ããã®çš®ã®ããã²ãŒã·ã§ã³ã¯ã
ãã¥ãŒããŒã¹ã®ããã²ãŒã·ã§ã³ ããšåŒã°ã
ãŸã ã
ã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«ãã£ãŠã¯ãããã²ãŒã·ã§ã³ããã»ã¹ãéåžžã«è€éã«ãªãå¯èœæ§ãããã泚ææ·±ã調æŽãå¿
èŠã§ãã 以äžã«ããã¥ãŒããŒã¹ã®ããã²ãŒã·ã§ã³ãå®è£
ãããšãã«çºçããå¯èœæ§ã®ããããã€ãã®èª²é¡ã瀺ããŸãã
- ããã²ãŒã·ã§ã³ã®ç®çïŒãã¥ãŒãè¿œå ãŸãã¯åé€ããããã®ã³ã³ãããŒïŒã¯ããã¥ãŒãè¿œå ãŸãã¯åé€ãããšãã«ããã²ãŒã·ã§ã³ãããŸããŸãªæ¹æ³ã§åŠçããããããŸããŸãªæ¹æ³ã§ããã²ãŒã·ã§ã³ããã»ã¹ãèŠèŠåãããã§ããŸãã å€ãã®å Žåãããã²ãŒã·ã§ã³ã¿ãŒã²ããã¯éåžžã®
Frame
ãŸãã¯ContentControl
ã§ããããã¥ãŒã¯ãããã®ã³ã³ãããŒã«å
ã«åã«è¡šç€ºãããŸãã ãã ããããã²ãŒã·ã§ã³ã®ç®çãTabControl
ãListBox
ãªã©ã®ç°ãªãçš®é¡ã®ã³ã³ãããŒã«ã§ããå€ãã®ã·ããªãªããããŸãã ãã®ãããªå Žåãããã²ãŒã·ã§ã³ã§ã¯ãæ¢åã®ãã¥ãŒãã¢ã¯ãã£ãåãŸãã¯åŒ·èª¿è¡šç€ºããããæ°ãããã¥ãŒãè¿œå ããå¿
èŠããããŸãã - å€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã²ãŒã·ã§ã³ãå®è¡ãããã¥ãŒãäœããã®æ¹æ³ã§èå¥ããå¿
èŠããããŸãã ããšãã°ãWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã²ãŒãããŠããããŒãžã¯URIã«ãã£ãŠçŽæ¥èå¥ãããŸãã ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¥ãŒã¯ãã®ã¿ã€ãã®ååããªãœãŒã¹ãã¡ã€ã«ã®å ŽæããŸãã¯ä»ã®å€ãã®æ¹æ³ã§èå¥ã§ããŸãã ççµåã¢ãžã¥ãŒã«ã§æ§æãããè€åã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå€ãã®å Žåãè¡šçŸã¯å¥ã
ã®ã¢ãžã¥ãŒã«ã§å®çŸ©ãããŸãã ãã®ãããªå Žåãåã
ã®è¡šçŸã¯ãã¢ãžã¥ãŒã«éã«è¿œå ã®äŸåé¢ä¿ãäœæããã«èå¥ã§ããå¿
èŠããããŸãã
- ãã¬ãŒã³ããŒã·ã§ã³ãç¹å®ããããããã®äœæãšåæåã®ããã»ã¹ãæ
éã«èª¿æŽããå¿
èŠããããŸãã ããã¯ãMVVMãã¿ãŒã³ã䜿çšããå Žåã«ç¹ã«éèŠã§ãã ãã®å Žåãããã²ãŒã·ã§ã³äžã«ãã¥ãŒãšå¯Ÿå¿ãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãäœæããäºãã«é¢é£ä»ããå¿
èŠããããŸãã UnityãMEFãªã©ã®äŸåæ§æ³šå
¥ã³ã³ãããŒã䜿çšããŠããå Žåããã¥ãŒã¢ãã«ããã¥ãŒãäœæãããšãã«ç¹å¥ãªæ§ç¯ã¡ã«ããºã ã䜿çšããå¿
èŠãããå ŽåããããŸãã
- MVVMãã¿ãŒã³ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³UIããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ããžãã¯ããã³ããžãã¹ããžãã¯ããåé¢ã§ããŸãã ãã ããããã²ãŒã·ã§ã³ããã»ã¹ã¯UIãšã¢ããªã±ãŒã·ã§ã³ããžãã¯ã®äž¡æ¹ãã«ããŒã§ããŸãã ãŠãŒã¶ãŒã¯ãã¥ãŒå
ã§ããã²ãŒã·ã§ã³ãéå§ã§ãããã®çµæããã¥ãŒãæŽæ°ãããŸãã ãã ããå€ãã®å Žåããã¥ãŒã¢ãã«ããããã²ãŒã·ã§ã³ãéå§ããã³èª¿æŽããæ©èœãå¿
èŠã«ãªããŸãã èæ
®ãã¹ãéèŠãªèæ
®äºé
ã¯ããã¥ãŒãšãã¥ãŒã¢ãã«éã®ããã²ãŒã·ã§ã³åäœãæ確ã«åºå¥ããæ©èœã§ãã
- ã¢ããªã±ãŒã·ã§ã³ã¯ãé©åã«åæåããããã«ããã¥ãŒã«ãã©ã¡ãŒã¿ãŒãŸãã¯ã³ã³ããã¹ããæž¡ãå¿
èŠãããå ŽåããããããŸãã ããšãã°ããŠãŒã¶ãŒããã¥ãŒã«ç§»åããŠéžæããã¯ã©ã€ã¢ã³ãã«é¢ããæ
å ±ãç·šéããå Žåãã¯ã©ã€ã¢ã³ãã®IDãŸãã¯ããŒã¿ããã¥ãŒã«è»¢éããŠãæ£ããæ
å ±ã衚瀺ããå¿
èŠããããŸãã
- å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¹å®ã®ããžãã¹èŠä»¶ãæºããããããã«ãããã²ãŒã·ã§ã³ãæ
éã«èª¿æŽããå¿
èŠããããŸãã ããšãã°ãå¥ã®ãã¥ãŒã«ç§»åããããšããŠãããšãã«ããŠãŒã¶ãŒãå
¥åããããŒã¿ã®äžæ£ç¢ºãã«é¢ãããããã¢ããã¡ãã»ãŒãžã衚瀺ãããå ŽåããããŸãã ãã®ããã»ã¹ã«ã¯ã以åã®ã¢ã€ãã¢ãšæ°ããã¢ã€ãã¢ã®èª¿æŽãå¿
èŠã§ãã
- æåŸã«ãææ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã§ã¯ããŠãŒã¶ãŒã¯åãŸãã¯æ¬¡ã®ãã¥ãŒã«ç§»åã§ããŸãã åæ§ã«ãäžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯äžé£ã®ãã¥ãŒãŸãã¯ãã©ãŒã ã䜿çšããŠã¯ãŒã¯ãããŒãå®è£
ãããŠãŒã¶ãŒãã¿ã¹ã¯ãå®äºããŠ1ã€ã®ãããã§è¡ããããã¹ãŠã®å€æŽãéä¿¡ããåã«ããŒã¿ãè¿œå ãŸãã¯ç·šéããããšã§ãååŸã«ããã²ãŒãã§ããããã«ããŸãã ãã®ãããªã·ããªãªã§ã¯ãããã²ãŒã·ã§ã³ã·ãŒã±ã³ã¹ãä¿åãç¹°ãè¿ãããŸãã¯äºåå®çŸ©ããããã«ãäœããã®çš®é¡ã®ãã°ã¡ã«ããºã ãå¿
èŠã§ãã
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
ã- ããã²ãŒã·ã§ã³ã¯ãã¡ãœããåŒã³åºããéããŠéå§ãããŸã
RequestNavigate
ã - ,
IConfirmNavigation
, ConfirmNavigationRequest
. - ( interaction request event ).
- .
- , .
- - , .
- , .
ãã®å³ã衚瀺ããã«ã¯ãããã¥ãŒåãæ¿ãããã²ãŒã·ã§ã³ã¯ã€ãã¯ã¹ã¿ãŒãããåç
§ããŠãã ããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ã©ã¹ã䜿çšããŠããŠãŒã¶ãŒãé»åã¡ãŒã«ã¡ãã»ãŒãžãäœæããããšãã§ããŸã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ã