सामग्री की तालिका
- परिचय
- प्रारम्भिक प्रिज्म अनुप्रयोग
- घटकों के बीच निर्भरता का प्रबंधन
- मॉड्यूलर अनुप्रयोग विकास
- एमवीवीएम पैटर्न को लागू करना
- उन्नत MVVM परिदृश्य
- उपयोगकर्ता इंटरफ़ेस निर्माण
- उपयोगकर्ता इंटरफ़ेस दिशानिर्देश
- नेविगेशन
- दृश्य-आधारित नेविगेशन
- शिथिल युग्मित घटकों के बीच पारस्परिक क्रिया
दृश्य-आधारित नेविगेशन
यद्यपि राज्य-आधारित नेविगेशन पहले वर्णित परिदृश्यों में उपयोगी हो सकता है, फिर भी किसी एप्लिकेशन में नेविगेशन को अक्सर एक दृश्य को दूसरे के साथ बदलने की आवश्यकता होती है। प्रिज्म में, इस तरह के नेविगेशन को "
व्यू-बेस्ड नेविगेशन " कहा जाता है।
आवेदन की आवश्यकताओं के आधार पर, नेविगेशन प्रक्रिया काफी जटिल हो सकती है और इसके लिए सावधानीपूर्वक समन्वय की आवश्यकता होती है। नीचे दी गई कुछ चुनौतियाँ हैं जो दृश्य-आधारित नेविगेशन को लागू करते समय आपके सामने आ सकती हैं:
- नेविगेशन का उद्देश्य - विचारों को जोड़ने या हटाने के लिए एक कंटेनर - विचारों को जोड़ने और हटाने के दौरान अलग-अलग तरीकों से नेविगेशन को संभाल सकता है, या यह विभिन्न तरीकों से नेविगेशन प्रक्रिया की कल्पना कर सकता है। कई मामलों में, नेविगेशन लक्ष्य एक नियमित
Frame
, या ContentControl
, और इन नियंत्रणों के अंदर केवल दृश्य प्रदर्शित होते हैं। हालांकि, कई परिदृश्य हैं जहां नेविगेशन का उद्देश्य एक अलग तरह का नियंत्रण है, जैसे कि TabControl
या ListBox
। ऐसे मामलों में, नेविगेशन को मौजूदा दृश्य को सक्रिय करने या हाइलाइट करने, या एक नया दृश्य जोड़ने की आवश्यकता हो सकती है। - किसी एप्लिकेशन को अक्सर किसी भी तरह से उस दृश्य की पहचान करनी होगी, जिसके लिए नेविगेशन किया जाना चाहिए। उदाहरण के लिए, वेब अनुप्रयोगों में, जिस पृष्ठ पर आप नेविगेट कर रहे हैं, वह सीधे यूआरआई द्वारा पहचाना जाता है। क्लाइंट अनुप्रयोगों में, एक दृश्य को इसके प्रकार के नाम से, संसाधन फ़ाइल के स्थान से, या कई अन्य तरीकों से पहचाना जा सकता है। मिश्रित युग्मित मॉड्यूल से मिलकर समग्र अनुप्रयोगों में, प्रतिनिधित्व अक्सर अलग-अलग मॉड्यूल में परिभाषित किए जाते हैं। व्यक्तिगत अभ्यावेदन, ऐसे मामलों में, मॉड्यूल के बीच अतिरिक्त निर्भरता पैदा किए बिना पहचाने जाने योग्य होना चाहिए।
- प्रस्तुति की पहचान होने के बाद, इसके निर्माण और आरंभीकरण की प्रक्रिया को सावधानीपूर्वक समन्वित किया जाना चाहिए। MVVM पैटर्न का उपयोग करते समय यह विशेष रूप से महत्वपूर्ण है। इस स्थिति में, दृश्य और संबंधित प्रस्तुति मॉडल को बनाया जाना चाहिए और नेविगेशन के दौरान एक दूसरे के साथ जुड़ा होना चाहिए। यदि आप एक निर्भरता इंजेक्शन कंटेनर का उपयोग कर रहे हैं, जैसे कि यूनिटी, या एमईएफ, तो आपको व्यू मॉडल और / या व्यू बनाते समय एक विशेष निर्माण तंत्र का उपयोग करने की आवश्यकता हो सकती है।
- एमवीवीएम पैटर्न आपको एप्लिकेशन यूआई को उसके उपयोगकर्ता इंटरैक्शन लॉजिक और व्यावसायिक तर्क से अलग करने की अनुमति देता है। हालाँकि, नेविगेशन प्रक्रिया UI और एप्लिकेशन लॉजिक दोनों को कवर कर सकती है। उपयोगकर्ता दृश्य के भीतर नेविगेशन शुरू कर सकता है, जिसके परिणामस्वरूप दृश्य अपडेट किया जाएगा। लेकिन अक्सर एक दृश्य मॉडल से नेविगेशन को आरंभ करने और समन्वय करने की क्षमता की आवश्यकता होगी। विचार करने के लिए एक महत्वपूर्ण विचार एक दृश्य और एक दृश्य मॉडल के बीच नेविगेशनल व्यवहार के बीच स्पष्ट रूप से अंतर करने की क्षमता है।
- इसे ठीक से प्रारंभ करने के लिए किसी एप्लिकेशन को अक्सर मापदंडों, या संदर्भ को देखने की आवश्यकता हो सकती है। उदाहरण के लिए, यदि कोई उपयोगकर्ता चयनित क्लाइंट, क्लाइंट की आईडी या उसके डेटा के बारे में जानकारी संपादित करने के लिए किसी दृश्य पर नेविगेट करता है, तो उसे सही जानकारी प्रदर्शित करने के लिए दृश्य में स्थानांतरित किया जाना चाहिए।
- कई अनुप्रयोगों को सावधानीपूर्वक समन्वय करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि कुछ व्यावसायिक आवश्यकताओं को पूरा किया गया है। उदाहरण के लिए, किसी उपयोगकर्ता को उसके द्वारा दर्ज किए गए डेटा की गलतता के बारे में एक पॉप-अप संदेश दिखाया जा सकता है, जबकि दूसरे दृश्य में नेविगेट करने की कोशिश कर रहा है। इस प्रक्रिया में पिछले और नए विचारों के बीच समन्वय की आवश्यकता होती है।
- अंत में, अधिकांश आधुनिक एप्लिकेशन उपयोगकर्ता को पिछले या अगले दृश्य पर नेविगेट करने की अनुमति देते हैं। इसी तरह, कुछ एप्लिकेशन दृश्य या रूपों के अनुक्रम का उपयोग करके अपने वर्कफ़्लो को लागू करते हैं और उपयोगकर्ता को कार्य पूरा करने और एक बैच में किए गए सभी परिवर्तनों को भेजने से पहले डेटा को जोड़ या संपादित करके उन्हें आगे या पीछे नेविगेट करने की अनुमति देते हैं। नेविगेशन अनुक्रम को सहेजने, दोहराने, या पूर्वनिर्धारित करने के लिए इस तरह के परिदृश्यों को किसी प्रकार के लॉगिंग तंत्र की आवश्यकता होती है।
प्रिज्म इन समस्याओं को हल करने के लिए मार्गदर्शन प्रदान करता है, नेविगेशन का समर्थन करने के लिए क्षेत्रीय तंत्र का विस्तार करता है। निम्नलिखित खंड प्रिज्म क्षेत्रों का एक संक्षिप्त सारांश प्रदान करते हैं और उन्हें दृश्य-आधारित नेविगेशन का समर्थन करने के लिए कैसे विस्तारित किया गया है।
क्षेत्र अवलोकन प्रिज्म
प्रिज्म क्षेत्रों को समग्र अनुप्रयोगों (कई मॉड्यूलों से युक्त अनुप्रयोग) के विकास का समर्थन करने के लिए डिज़ाइन किया गया था, जिससे उपयोगकर्ता इंटरफ़ेस को शिथिल युग्मित तरीके से निर्मित किया जा सकता है। क्षेत्र आपको एप्लिकेशन 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
:
RequestNavigate
.- ,
IConfirmNavigation
, ConfirmNavigationRequest
. - ( interaction request event ).
- .
- , .
- - , .
- , .
,
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 .