प्रिज्म डेवलपर की गाइड - भाग 8.1, दृश्य-आधारित नेविगेशन

सामग्री की तालिका
  1. परिचय
  2. प्रारम्भिक प्रिज्म अनुप्रयोग
  3. घटकों के बीच निर्भरता का प्रबंधन
  4. मॉड्यूलर अनुप्रयोग विकास
  5. एमवीवीएम पैटर्न को लागू करना
  6. उन्नत MVVM परिदृश्य
  7. उपयोगकर्ता इंटरफ़ेस निर्माण
    1. उपयोगकर्ता इंटरफ़ेस दिशानिर्देश
  8. नेविगेशन
    1. दृश्य-आधारित नेविगेशन
  9. शिथिल युग्मित घटकों के बीच पारस्परिक क्रिया

दृश्य-आधारित नेविगेशन


यद्यपि राज्य-आधारित नेविगेशन पहले वर्णित परिदृश्यों में उपयोगी हो सकता है, फिर भी किसी एप्लिकेशन में नेविगेशन को अक्सर एक दृश्य को दूसरे के साथ बदलने की आवश्यकता होती है। प्रिज्म में, इस तरह के नेविगेशन को " व्यू-बेस्ड नेविगेशन " कहा जाता है।

आवेदन की आवश्यकताओं के आधार पर, नेविगेशन प्रक्रिया काफी जटिल हो सकती है और इसके लिए सावधानीपूर्वक समन्वय की आवश्यकता होती है। नीचे दी गई कुछ चुनौतियाँ हैं जो दृश्य-आधारित नेविगेशन को लागू करते समय आपके सामने आ सकती हैं:


प्रिज्म इन समस्याओं को हल करने के लिए मार्गदर्शन प्रदान करता है, नेविगेशन का समर्थन करने के लिए क्षेत्रीय तंत्र का विस्तार करता है। निम्नलिखित खंड प्रिज्म क्षेत्रों का एक संक्षिप्त सारांश प्रदान करते हैं और उन्हें दृश्य-आधारित नेविगेशन का समर्थन करने के लिए कैसे विस्तारित किया गया है।

क्षेत्र अवलोकन प्रिज्म


प्रिज्म क्षेत्रों को समग्र अनुप्रयोगों (कई मॉड्यूलों से युक्त अनुप्रयोग) के विकास का समर्थन करने के लिए डिज़ाइन किया गया था, जिससे उपयोगकर्ता इंटरफ़ेस को शिथिल युग्मित तरीके से निर्मित किया जा सकता है। क्षेत्र आपको एप्लिकेशन UI में मॉड्यूल में परिभाषित विचारों को प्रदर्शित करने की अनुमति देते हैं, और मॉड्यूल को उपयोगकर्ता इंटरफ़ेस की पूरी संरचना के बारे में जानने की आवश्यकता नहीं है। यह आपको आसानी से यूआई एप्लिकेशन के लेआउट को बदलने की अनुमति देता है, बिना मॉड्यूल में परिवर्तन करने की आवश्यकता के बिना।

अधिकांश क्षेत्रों के लिए प्रिज्म क्षेत्र, प्लेसहोल्डर्स नामित किए जाते हैं जिसमें दृश्य प्रदर्शित होते हैं। किसी भी नियंत्रण को संलग्न क्षेत्र RegionName संपत्ति जोड़कर एक क्षेत्र के रूप में घोषित किया जा सकता है, जैसा कि नीचे दिखाया गया है।

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

एक क्षेत्र के रूप में परिभाषित प्रत्येक नियंत्रण के लिए, प्रिज्म एक Region वस्तु बनाता है जो Region का प्रतिनिधित्व करता है और एक रीजन एडेप्टर ऑब्जेक्ट (क्षेत्र एडाप्टर) जिसका कार्य स्थान और नियंत्रण में विचारों की सक्रियता को नियंत्रित करना है। प्रिज्म लाइब्रेरी अधिकांश सिल्वरलाइट और WPF नियंत्रणों के लिए एक RegionAdapter कार्यान्वयन प्रदान करती है। अतिरिक्त नियंत्रणों का समर्थन करने के लिए या विशेष व्यवहारों को लागू करने के लिए आप अपना स्वयं का RegionAdapter बना सकते हैं। क्षेत्र प्रबंधक वर्ग (क्षेत्र प्रबंधक) आवेदन के Region वस्तुओं तक पहुंच प्रदान करता है।

कई मामलों में, एक क्षेत्र एक सरल नियंत्रण हो सकता है, जैसे कि ContentControl , जो एक बार में केवल एक दृश्य प्रदर्शित कर सकता है। अन्य मामलों में, यह एक नियंत्रण हो सकता है जो आपको एक साथ कई दृश्य प्रदर्शित करने की अनुमति देता है, जैसे कि TabControl , या ListBox

एक क्षेत्र अनुकूलक उस क्षेत्र से जुड़े विचारों की सूची का प्रबंधन करता है। इनमें से एक या अधिक दृश्य अपनी सामग्री प्रदर्शन रणनीति के अनुसार एक क्षेत्र नियंत्रण में प्रदर्शित किए जा सकते हैं। दृश्य को ऐसे नाम दिए जा सकते हैं जिनका उपयोग बाद में उन्हें खोजने के लिए किया जा सकता है। एक क्षेत्र एडेप्टर भी नियंत्रित करता है कि कौन सा दृश्य उस क्षेत्र में सक्रिय है। सक्रिय, वह दृश्य है जो वर्तमान में हाइलाइट किया गया है, या सबसे ऊपर है। उदाहरण के लिए, TabControl , चयनित टैब पर प्रदर्शित दृश्य सक्रिय है; ContentControl , वह दृश्य जो वर्तमान में स्क्रीन पर प्रदर्शित होता है।

नोट।
यह निर्धारित करना कि कौन सा दृश्य सक्रिय है, विशेष रूप से नेविगेशन प्रक्रिया में महत्वपूर्ण है। यह सक्रिय रूप से नेविगेशन में भाग लेने के लिए अक्सर आवश्यक हो सकता है, उदाहरण के लिए, उपयोगकर्ता द्वारा इसे छोड़ने से पहले डेटा को बचाने के लिए, या ऑपरेशन को रद्द करने या पुष्टि करने का अनुरोध करने के लिए।

प्रिज्म के पिछले संस्करणों ने दो अलग-अलग तरीकों से क्षेत्रों में प्रतिनिधित्व प्रदर्शित करना संभव बना दिया। पहली विधि, जिसे दृश्य इंजेक्शन कहा जाता है, ने एक क्षेत्र में प्रोग्राम प्रतिनिधित्व को प्रदर्शित करना संभव बना दिया है। डायनामिक सामग्री प्रदर्शित करते समय यह दृष्टिकोण उपयोगी होता है, जब किसी क्षेत्र में प्रदर्शित किए जाने वाले दृश्य में अक्सर परिवर्तन होता है, जो एप्लिकेशन लॉजिक को प्रदर्शित करता है।

Region वर्ग में Add मेथड प्रदान करके एंबेडिंग व्यू का समर्थन किया जाता है। निम्न कोड दिखाता है कि आप किस तरह से एक Region वस्तु का संदर्भ प्राप्त कर सकते हैं। उदाहरण में, डीआई कंटेनर का उपयोग करके दृश्य बनाया जाता है।

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

अगली विधि, जिसे व्यू डिस्कवरी कहा जाता है, मॉड्यूल को क्षेत्र के नामों के साथ व्यू प्रकार के मानचित्रण को पंजीकृत करने की अनुमति देता है। फिलहाल जब स्क्रीन पर दिए गए नाम वाला क्षेत्र प्रदर्शित होता है, तो संबंधित दृश्य का एक उदाहरण इस क्षेत्र में स्वचालित रूप से बनाया और प्रदर्शित किया जाएगा। यह वृद्धि अपेक्षाकृत स्थिर सामग्री को प्रदर्शित करने के लिए उपयोगी है जब क्षेत्र में प्रदर्शित दृश्य नहीं बदलता है।

RegionManager वर्ग में RegisterViewWithRegion विधि के माध्यम से दृश्य खोज का समर्थन किया जाता है। यह विधि आपको एक कॉलबैक विधि निर्दिष्ट करने की अनुमति देती है जिसे तब निर्दिष्ट किया जाएगा जब निर्दिष्ट नाम वाला क्षेत्र प्रदर्शित होता है। निम्नलिखित उदाहरण से पता चलता है कि आप "मेनरेजियन" नामक क्षेत्र को प्रदर्शित करते समय एक दृश्य (निर्भरता इंजेक्शन कंटेनर का उपयोग करके) कैसे बना सकते हैं।

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

प्रिज्म क्षेत्रों के अधिक विस्तृत अवलोकन के लिए, " उपयोगकर्ता इंटरफ़ेस बनाना " अध्याय देखें। लेख के बाकी हिस्सों में चर्चा की जाएगी कि कैसे नेविगेशन का समर्थन करने के लिए क्षेत्रों का विस्तार किया गया था, और पहले वर्णित समस्याओं को कैसे दूर किया जाए।

क्षेत्रों में बुनियादी नेविगेशन


क्षेत्रों में प्रतिनिधित्व प्रदर्शित करने के उपरोक्त दोनों तरीकों को नेविगेशन के कुछ सीमित रूप के रूप में माना जा सकता है - प्रतिनिधित्व प्रस्तुत करना स्पष्ट, प्रोग्राम नेविगेशन का एक रूप है, और प्रतिनिधित्व का पता लगाना एक अंतर्निहित या विलंबित नेविगेशन है। हालांकि, प्रिज्म 4.0 में, यूआरआई और एक एक्स्टेंसिबल नेविगेशन तंत्र के आधार पर अधिक सामान्य नेविगेशन अवधारणाओं का समर्थन करने के लिए क्षेत्रों का विस्तार किया गया था।

एक क्षेत्र के भीतर नेविगेट करने का मतलब है इसमें एक नया दृश्य प्रदर्शित करना। प्रदर्शित दृश्य को एक यूआरआई द्वारा पहचाना जाता है, जो डिफ़ॉल्ट रूप से, उस दृश्य के नाम को संदर्भित करता है जिससे नेविगेशन किया जाता है। आप INavigateAsync इंटरफ़ेस में निर्धारित RequestNavigate विधि का उपयोग करके प्रोग्रामेटिक रूप से नेविगेशन आरंभ कर सकते हैं।

नोट।
इसके नाम के बावजूद, INavigateAsync इंटरफ़ेस एक अलग थ्रेड में निष्पादित अतुल्यकालिक नेविगेशन का अर्थ नहीं है। इसके विपरीत, INavigateAsync में छद्म-एसिंक्रोनस नेविगेशन शामिल है। RequestNavigate विधि नेविगेशन के अंत के बाद सिंक्रोनस को समाप्त कर सकती है, या यह नेविगेशन के अंत से पहले समाप्त हो सकती है, उदाहरण के लिए, जब उपयोगकर्ता को नेविगेशन की पुष्टि करने की आवश्यकता होती है। नेविगेशन के दौरान आपको कॉलबैक विधि निर्दिष्ट करने की अनुमति देकर प्रिज्म पृष्ठभूमि के धागों को संभालने की जटिलता के बिना ऐसे परिदृश्यों का समर्थन करना संभव बनाता है।

INavigateAsync इंटरफ़ेस इस Region लागू करता है, जिससे आप इस क्षेत्र में नेविगेशन शुरू कर सकते हैं।

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

आप उस क्षेत्र के नाम पर RequestNavigate विधि भी कह सकते हैं, जिसमें उस क्षेत्र का नाम निर्दिष्ट किया जाता है जहाँ नेविगेशन किया जाता है। यह विधि संबंधित क्षेत्र का लिंक ढूंढती है और उस पर RequestNavigate विधि को कॉल करती है। यह नीचे दिए गए उदाहरण में दिखाया गया है।

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

डिफ़ॉल्ट रूप से, नेविगेशन URI उस दृश्य का नाम सेट करता है जिसके द्वारा वह कंटेनर में पंजीकृत है। नीचे दिया गया कोड एक एकता कंटेनर में दृश्य पंजीकरण नाम और नेविगेशन के दौरान इस नाम के उपयोग के बीच के संबंध को दर्शाता है।

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

नोट।
नेविगेशन सेवा द्वारा एक दृश्य बनाते समय, यह कंटेनर से प्रकार के ऑब्जेक्ट का अनुरोध करता है, नेविगेशन URI में दिए गए नाम के साथ। विभिन्न कंटेनर इसका समर्थन करने के लिए विभिन्न पंजीकरण तंत्र का उपयोग करते हैं। उदाहरण के लिए, एकता में, आपको इस दृश्य के साथ Object प्रकार का मिलान करके और नेविगेशन यूआरआई में नाम के अनुरूप पंजीकरण नाम प्रदान करके विचारों को पंजीकृत करना होगा। MEF में, आपको ExportAttribute विशेषता में अनुबंध का नाम निर्दिष्ट करना होगा।

एक उदाहरण है। एक दृश्य को पंजीकृत करने के लिए एकता का उपयोग करते समय:

उपयोग न करें:
 container.RegisterType<InboxView>("InboxView"); 

इसके बजाय उपयोग करें:
 container.RegisterType<object,InboxView>("InboxView"); 

नोट।
पंजीकरण और नेविगेशन के लिए उपयोग किया जाने वाला नाम दृश्य प्रकार के नाम के साथ जुड़ा होना जरूरी नहीं है, कोई भी स्ट्रिंग करेगा। उदाहरण के लिए, एक स्ट्रिंग के बजाय, आप स्पष्ट रूप से पूरी तरह से योग्य प्रकार के नाम का उपयोग कर सकते हैं: typeof(InboxView).FullName ;

MEF में, आप केवल वांछित नाम के साथ दृश्य निर्यात कर सकते हैं।

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

नेविगेशन के दौरान, कंटेनर से संबंधित दृश्य मॉडल और अन्य निर्भरता के साथ एक दिए गए दृश्य का अनुरोध किया जाता है। उसके बाद, इसे निर्दिष्ट क्षेत्र में जोड़ा जाता है और सक्रिय किया जाता है (लेख में सक्रियण के बारे में विवरण आगे होगा)।

नोट।
पूर्ववर्ती विवरण दृश्य-प्रथम नेविगेशन को दिखाता है जब एक यूआरआई उस दृश्य के नाम को संदर्भित करता है जिसके साथ इसे कंटेनर में निर्यात या पंजीकृत किया गया था। व्यू-फर्स्ट नेविगेशन के साथ, एक आश्रित व्यू मॉडल को व्यू डिपेंडेंसी के रूप में बनाया जाता है। एक वैकल्पिक दृष्टिकोण दृश्य मॉडल का उपयोग करना है - पहला नेविगेशन, जब नेविगेशन यूआरआई उस दृश्य मॉडल के नाम को संदर्भित करता है जिसके साथ यह कंटेनर में पंजीकृत था। यह दृष्टिकोण तब उपयोगी हो सकता है जब विचारों को डेटा टेम्प्लेट के रूप में परिभाषित किया जाता है, या जब आप चाहते हैं कि एक नेविगेशन योजना को विचारों से स्वतंत्र रूप से परिभाषित किया जाए।

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 लागू करता है, यदि ऐसा है, तो आवश्यक तरीके इस पर कहे जाते हैं। इसके अलावा, प्रिज्म इस इंटरफ़ेस के कार्यान्वयन की जांच उस ऑब्जेक्ट पर करता है जिसमें व्यू की DataContext प्रॉपर्टी सेट की जाती है, और यदि सफल हो, तो आवश्यक तरीकों को कॉल करता है।

यह इंटरफ़ेस नेविगेशन ऑपरेशन में भाग लेने के लिए एक दृश्य, या दृश्य मॉडल की अनुमति देता है। INavigationAware इंटरफ़ेस तीन विधियों को परिभाषित करता है:

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

IsNavigationTarget विधि क्षेत्र में एक मौजूदा दृश्य या एक दृश्य मॉडल को यह दिखाने की अनुमति देती है कि क्या वह नेविगेशन अनुरोध को संभाल सकता है। यह उन मामलों में उपयोगी हो सकता है जहां आप नेविगेशन को संभालने के लिए मौजूदा दृश्य का पुन: उपयोग करना चाहते हैं, या मौजूदा दृश्य में नेविगेट करना चाहते हैं। उदाहरण के लिए, विभिन्न ग्राहकों को चुनने पर ग्राहक की जानकारी प्रदर्शित करने वाला दृश्य अपडेट किया जा सकता है। अधिक जानकारी के लिए, लेख में बाद में "मौजूदा दृश्यों पर नेविगेट करना" अनुभाग देखें।

OnNavigatedFrom और OnNavigatedTo को एक नेविगेशन ऑपरेशन के दौरान कहा जाता है। यदि क्षेत्र में वर्तमान सक्रिय दृश्य (या इसके दृश्य मॉडल) इस इंटरफ़ेस को लागू करता है, तो नेविगेशन शुरू होने से पहले OnNavigatedFrom विधि OnNavigatedFrom कॉल किया जाता है। OnNavigatedFrom विधि पिछले दृश्य को अपनी स्थिति को बचाने, या उपयोगकर्ता इंटरफ़ेस से निष्क्रिय करने या हटाने के लिए तैयार करने की अनुमति देती है। उदाहरण के लिए, एक दृश्य उपयोगकर्ता द्वारा डेटाबेस में किए गए परिवर्तनों को सहेज सकता है, या उन्हें वेब सेवा को भेज सकता है।

यदि नव निर्मित दृश्य (या दृश्य मॉडल) इस इंटरफ़ेस को लागू करता है, तो इसकी OnNavigatedTo विधि OnNavigatedTo नेविगेशन के बाद कहा जाता है। OnNavigatedTo विधि नेविगेशन यूआरआई के साथ पारित मापदंडों का उपयोग करते हुए संभवतः प्रदर्शित करने के लिए अनुमति देता है। अधिक जानकारी के लिए अगला भाग, "नेविगेशन के दौरान पैरामीटर्स पास करना" देखें।

लक्ष्य क्षेत्र में एक नया दृश्य बनाने, आरंभ करने और जोड़ने के बाद, यह सक्रिय हो जाता है, और पिछला दृश्य निष्क्रिय हो जाता है। कभी-कभी, आपको किसी क्षेत्र से एक निष्क्रिय दृश्य निकालने की आवश्यकता हो सकती है। प्रिज़्म में एक 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 .

, , . , EditCustomer TabControl , , ID 123 ID 456. EditCustomer ID 456, ( , ). EditCustomer ID 789, UI.

. , , . , , . , , .

Prism INavigationAware.IsNavigationTarget . , , . , EditCustomer , IsNavigationTarget EditCustomer , . Prism URI, , .

नोट।
, Prism , URI . , 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 , , . , .

,


, , . , , , . , , , , , , . Prism IConfirmNavigationRequest .

IConfirmNavigationRequest INavigationAware ConfirmNavigationRequest . , , , , , . Interaction Request , 6 " MVVM ", .

नोट।
ConfirmNavigationRequest ( ), OnNavigatedFrom , .

ConfirmNavigationRequest , , , , . , - ( continuation callback ). -, . Interaction Request , . .

,

InteractionRequest :

  1. RequestNavigate .
  2. , IConfirmNavigation , ConfirmNavigationRequest .
  3. ( interaction request event ).
  4. .
  5. , .
  6. - , .
  7. , .


, View-Switching Navigation Quick Start . , ComposeEmailView , ComposeEmailViewModel . IConfirmNavigation . , , Calendar , , 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-). -.

, . , - . , -, .

( Navigation Journal )


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 , . , Back , . , GoForward ( wizard style workflow ).

 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 Navigation Frameworks


Prism , , MVVM , Unity, MEF. , , , .

, Prism , , . - , .

Prism Silverlight navigation framework ( Silverlight 3.0), WPF's navigation framework . , Prism Silverlight WPF navigation frameworks .

Silverlight navigation framework , URI. Frame . Frame , , , Frame . Silverlight navigation framework Prism . , , Prism.

WPF navigation framework , Silverlight. , MVVM . Frame , , UI. WPF navigation framework Prism, , , Prism, , .


. , , Prism .



अतिरिक्त जानकारी


Visual State Manager, «VisualStateManager Class» MSDN: http://msdn.microsoft.com/en-us/library/cc626338(v=VS.95).aspx .

Microsoft Expression Blend, «Working with built-in behaviors» MSDN: http://msdn.microsoft.com/en-us/library/ff724013(v=Expression.40).aspx .

Microsoft Expression Blend, «Creating Custom Behaviors» MSDN: http://msdn.microsoft.com/en-us/library/ff724708(v=Expression.40).aspx .

Silverlight Navigation Framework , «Navigation Overview» MSDN: http://msdn.microsoft.com/en-us/library/cc838245(VS.95).aspx .

Silverlight's Navigation Framework Prism, «Integrating Prism v4 Region Navigation with Silverlight Frame Navigation» Karl Schifflett's: http://blogs.msdn.com/b/kashiffl/archive/2010/10/05/integrating-prism-v4-region-navigation-with-silverlight-frame-navigation.aspx .

Source: https://habr.com/ru/post/In182052/


All Articles