प्रिज्म डेवलपर की गाइड - भाग 7, एक यूजर इंटरफेस बनाना

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

उपयोगकर्ता इंटरफ़ेस बनाने के लिए कई प्रतिमान हैं:



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

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

स्टॉक ट्रेडर संदर्भ कार्यान्वयन (स्टॉक ट्रेडर आरआई) Shell में घोषित क्षेत्रों में विभिन्न मॉड्यूल से विचारों को लोड करके उपयोगकर्ता इंटरफ़ेस को संकलित करता है, जैसा कि नीचे चित्र में दिखाया गया है।

स्टॉक ट्रेडर आरआई क्षेत्र और दृश्य


उपयोगकर्ता इंटरफ़ेस लेआउट


एक समग्र अनुप्रयोग के मूल तत्व को Shell कहा जाता है। खोल आवेदन के लिए एक मास्टर पृष्ठ के रूप में काम करता है और इसमें कई क्षेत्र ( Region ) होते हैं। क्षेत्र प्लेसहोल्डर तत्व हैं जिसमें सामग्री को रन टाइम पर लोड किया जाता है। क्षेत्र विभिन्न UI तत्वों से जुड़े हो सकते हैं, जैसे कि ContentControl , ItemsControl , TabControl या उपयोगकर्ता नियंत्रण, और अपनी सामग्री को नियंत्रित कर सकते हैं। क्षेत्र आवेदन की आवश्यकताओं के आधार पर या तो स्वचालित रूप से या मांग पर सामग्री डाउनलोड कर सकते हैं।

आमतौर पर, एक क्षेत्र की सामग्री एक दृश्य है। यह एप्लिकेशन के उपयोगकर्ता इंटरफ़ेस का हिस्सा इनकैप्सुलेट करता है और इसे बाकी एप्लिकेशन से अलग रखता है। दृश्य या तो उपयोगकर्ता नियंत्रण या डेटा टेम्पलेट हो सकता है।

क्षेत्र लेआउट और विचारों के प्रदर्शन को नियंत्रित करते हैं। क्षेत्र उनके नाम से पहुँचा जा सकता है। वे विचारों के गतिशील जोड़ और विलोपन का भी समर्थन करते हैं। आप कंटेनरों के रूप में क्षेत्रों के बारे में सोच सकते हैं जिसमें विचार गतिशील रूप से भरे हुए हैं।

निम्नलिखित अनुभाग समग्र अनुप्रयोग बनाने के लिए उच्च-स्तरीय अवधारणाओं में अंतर्दृष्टि प्रदान करते हैं।

शैल (शैल)


शेल अनुप्रयोग का मूल ऑब्जेक्ट है और इसमें उपयोगकर्ता इंटरफ़ेस के मुख्य भाग होते हैं। एक WPF अनुप्रयोग में, एक Windows ऑब्जेक्ट शेल के रूप में कार्य करता है। सिल्वरलाइट एप्लिकेशन में - RootVisualUserControl

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

खोल आवेदन के सामान्य स्वरूप को परिभाषित करता है। यह उन शैलियों और सीमाओं को परिभाषित कर सकता है जो शेल में ही दिखाई देती हैं, साथ ही शैलियों, टेम्पलेट्स, और थीम जिन्हें डाउनलोड करने योग्य विचारों पर लागू किया जा सकता है।

आमतौर पर, एक शेल प्राथमिक WPF या सिल्वरलाइट परियोजना का एक हिस्सा है। एक असेंबली युक्त एक असेंबल असेंबलियों को लोड करने योग्य विचारों के साथ संदर्भित कर सकता है, या हो सकता है कि असेंबलियों को खोज और रन समय पर लोड किया जाए।

प्रस्तुति (दृश्य)


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

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

समग्र विचार

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

दृश्य और डिजाइन पैटर्न

यद्यपि प्रिज्म इस पर जोर नहीं देता है, आपको विचार बनाते समय कुछ डिज़ाइन पैटर्न का उपयोग करने पर विचार करना चाहिए। स्टॉक ट्रेडर आरआई और क्विकस्टार्ट्स एक इंटरफेस और लॉजिक के बीच जिम्मेदारी साझा करने के लिए एमवीवीएम पैटर्न का उपयोग करते हैं।

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

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

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

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

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

प्रतिनिधित्व से तर्क का अलग होना जिम्मेदारी के अलगाव को बढ़ावा देता है। परीक्षण करने की क्षमता बढ़ाने के अलावा, यह UI डिज़ाइनर को स्वतंत्र रूप से डेवलपर के काम करने की अनुमति देता है। MVVM पैटर्न के बारे में अधिक जानकारी के लिए, भाग 5 देखें: "MVVM पैटर्न को लागू करना"।

कमांड , यूआई ट्रिगर , क्रिया और व्यवहार

यदि प्रस्तुति तर्क अलग कोड में स्थित है, तो इवेंट हैंडलर का उपयोग UI के साथ बातचीत करने के लिए किया जाता है। हालाँकि, MVVM का उपयोग करते समय, दृश्य मॉडल UI में उत्पन्न घटनाओं को सीधे संसाधित नहीं कर सकता है। UI से प्रेजेंटेशन मॉडल में घटनाओं को पुनर्निर्देशित करने के लिए, आप कमांड, यूआई ट्रिगर्स, एक्शन या व्यवहार का उपयोग कर सकते हैं।

कमांड शब्दार्थ और वस्तु को अलग करता है, जिस पर इस कमांड को कमांड के तर्क से कहा जाता है। साथ ही, कमांड ऑब्जेक्ट यह निर्धारित करना संभव बनाता है कि क्या इस कमांड को फिलहाल निष्पादित किया जा सकता है। UI में कमांड ICommand प्रकार के दृश्य मॉडल के गुणों से बंधे हैं। अधिक जानकारी के लिए, भाग 5 में "कमांड्स" अनुभाग देखें।

UI ट्रिगर, क्रियाएँ और व्यवहार Microsoft.Expression.Interactivity नाम स्थान का हिस्सा हैं और अभिव्यक्ति मिश्रण के साथ आते हैं। वे एक्सप्रेशन एसडीके का भी हिस्सा हैं। ये घटक यूआई घटनाओं या आदेशों को इंटरसेप्ट करने के लिए एक व्यापक एपीआई प्रदान करते हैं और फिर उन्हें वर्तमान डेटा संदर्भ ऑब्जेक्ट के ICommand गुणों के लिए रूट करते हैं। उनके बारे में अधिक जानकारी के लिए, भाग 5 में संबंधित अनुभाग देखें।

डेटा बाइंडिंग

डेटा बाइंडिंग XAML प्लेटफार्मों की सबसे महत्वपूर्ण विशेषता है। XAML का उपयोग करने वाले अनुप्रयोगों का सफलतापूर्वक निर्माण करने के लिए, आपको डेटा बाइंडिंग में अच्छा होना चाहिए।

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

डेटा बाइंडिंग आपको उन स्रोतों और रिसीवर को जोड़ने की अनुमति देता है जो मूल्य कन्वर्टर्स का उपयोग करके डेटा प्रकार से असंगत हैं। यह डेटा सत्यापन के लिए कई तंत्र भी प्रदान करता है।

क्षेत्र (क्षेत्र)


क्षेत्र प्रबंधक, क्षेत्र और क्षेत्र एडेप्टर के माध्यम से प्रिज्म में क्षेत्र उपलब्ध हैं। अगला भाग बताता है कि वे कैसे काम करते हैं और बातचीत करते हैं।

क्षेत्रों के प्रबंधक ( क्षेत्र प्रबंधक )

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

क्षेत्र, नियंत्रण और एडाप्टर के संबंध में

RegionManager कोड में या XAML में क्षेत्र बना सकता है। संलग्न RegionManager.RegionName संपत्ति का उपयोग XAML में एक क्षेत्र बनाने के लिए किया जाता है जो इसे एक नियंत्रण में लागू करता है जो इस क्षेत्र के लिए एक मेजबान के रूप में कार्य करेगा।

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

RegionalManager एक संलग्न RegionContext संपत्ति प्रदान करता है जिसके साथ आप क्षेत्रों के बीच डेटा का आदान-प्रदान कर सकते हैं।

एक क्षेत्र बनाएँ

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

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

किसी क्षेत्र में शून्य या अधिक तत्व हो सकते हैं। इस पर निर्भर करते हुए कि किसी दिए गए क्षेत्र के लिए मेजबान के रूप में नियंत्रण का उपयोग किया जाता है, एक या अधिक तत्व दिखाई दे सकते हैं। उदाहरण के लिए, ContentControl केवल एक ही वस्तु प्रदर्शित कर सकता है, जबकि ItemsControl एक साथ कई आइटम प्रदर्शित कर सकता है।

निम्नलिखित चित्रण में, स्टॉक ट्रेडर आरआई शेल में चार क्षेत्र शामिल हैं: MainRegion , MainToolbarRegion , MainToolbarRegion , और MainToolbarRegion । ये क्षेत्र विभिन्न एप्लिकेशन मॉड्यूल से भरे हुए हैं - सामग्री किसी भी समय बदल सकती है।

क्षेत्र के शेयर बाजार के आरआई

किसी क्षेत्र में एक मॉड्यूल से एक उपयोगकर्ता नियंत्रण प्रदर्शित करना

यह प्रदर्शित करने के लिए कि मॉड्यूल और सामग्री क्षेत्रों से कैसे संबंधित हैं, निम्नलिखित चित्रण देखें। यह WatchModule और NewsModule के संघ को शेल में संबंधित क्षेत्र के साथ NewsModule

MainRegion क्षेत्र में WatchListView नियंत्रण शामिल है जो WatchModule मॉड्यूल में निहित है। ResearchRegion क्षेत्र में ArticleView उपयोगकर्ता नियंत्रण भी शामिल है, जो NewsModule मॉड्यूल में स्थित है।

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

किसी क्षेत्र में एक मॉड्यूल से एक उपयोगकर्ता नियंत्रण प्रदर्शित करता है

क्षेत्र की मानक कार्यक्षमता


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

निम्नलिखित अनुभाग क्षेत्रीय एडेप्टर और क्षेत्रीय व्यवहार का वर्णन करते हैं।

क्षेत्र के एडेप्टर

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



नोट।
प्रिज्म लाइब्रेरी के सिल्वरलाइट संस्करण में TabControlRegionAdapter नाम का एक और एडॉप्टर शामिल है। इसका कारण यह है कि सिल्वरलाइट में TabControl Selector वर्ग का वंशज नहीं है और WPF में अपने समकक्ष से एक अलग व्यवहार है।

क्षेत्रीय व्यवहार

प्रिज्म क्षेत्रीय व्यवहार की अवधारणा का परिचय देता है। ये प्लग-इन घटक हैं जो अधिकांश क्षेत्रों की कार्यक्षमता के लिए जिम्मेदार हैं। व्यवहार खोज और क्षेत्र के संदर्भ का समर्थन करने के लिए, और WPF और सिल्वरलाइट दोनों के लिए एक सुसंगत एपीआई बनाने के लिए व्यवहार पेश किया गया था। इसके अतिरिक्त, व्यवहार के कारण, क्षेत्रों की कार्यक्षमता के विस्तार का एक प्रभावी तरीका प्रकट होता है।

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

अगले कुछ खंड मानक व्यवहारों के बारे में बात करेंगे जो स्वचालित रूप से क्षेत्रों में जोड़े जाते हैं। एक अपवाद SelectorItemsSourceSyncBehavior का व्यवहार है, जो केवल उन नियंत्रणों को जोड़ता है जो Selector वर्ग के वंशज हैं।

पंजीकरण व्यवहार

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

ऑटो-जनसंख्या व्यवहार

अभ्यावेदन खोजने के लिए दो वर्ग जिम्मेदार हैं। उनमें से एक AutoPopulateRegionBehavior । किसी क्षेत्र में शामिल होने पर, इस क्षेत्र के नाम के तहत पंजीकृत सभी प्रकार के विचार प्राप्त होते हैं। उसके बाद, वह इन अभ्यावेदन की प्रतियां बनाता है और उन्हें क्षेत्र में जोड़ता है। एक क्षेत्र बनाने के बाद, AutoPopulateRegionBehavior किसी दिए गए क्षेत्र के नाम के लिए RegionViewRegistry व्यू RegionViewRegistry में नए विचारों के पंजीकरण की निगरानी करता है।

यदि आपको विचारों की खोज की प्रक्रिया पर अधिक नियंत्रण की आवश्यकता है, तो आप IRegionViewRegistry और AutoPopulateRegionBehavior का अपना कार्यान्वयन बना सकते हैं।

क्षेत्र संदर्भ व्यवहार

क्षेत्र के संदर्भ की कार्यक्षमता में संलग्न है SyncRegionContextWithHostBehaviorऔर BindRegionContextToDependencyObjectBehaviorये व्यवहार क्षेत्र के लिए बनाए गए संदर्भ में परिवर्तन देखने और इस संदर्भ को दृश्य से जुड़ी संबंधित निर्भरता संपत्ति के साथ सिंक्रनाइज़ करने के लिए जिम्मेदार हैं।

सक्रियण व्यवहार

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

क्षेत्र जीवनकाल व्यवहार

RegionMemberLifetimeBehaviorयह निर्धारित करता है कि निष्क्रिय होने पर क्षेत्र से तत्व को हटा दिया जाना चाहिए या नहीं। यह निर्धारित करने के लिए कि कौन से आइटम निष्क्रिय हैं, RegionMemberLifetimeBehaviorइस ActiveViewsक्षेत्र के संग्रह की निगरानी करता है। हटाने के लिए तत्व के लिए व्यवहार की जाँच करता है IRegionMemberLifetime, या RegionMemberLifetimeAttribute(उस क्रम में) यह निर्धारित करने के लिए कि हटाए जाने पर उसे बचाया जाना चाहिए।

यदि आइटम है System.Windows.FrameworkElement, तो यह DataContextउपलब्धता के लिए भी जांचा जाता है IRegionMemberLifetime, या RegionMemberLifetimeAttribute

निम्नलिखित क्रम में क्षेत्र तत्वों की जाँच की जाती है:

  1. मूल्य IRegionMemberLifetime.KeepAlive
  2. मूल्य IRegionMemberLifetime.KeepAlive DataContext
  3. मूल्य RegionMemberLifetimeAttribute.KeepAlive
  4. मूल्य RegionMemberLifetimeAttribute.KeepAlive DataContext


नियंत्रण-विशिष्ट व्यवहार

SelectorItemsSourceSyncBehaviorइसका उपयोग केवल तभी किया जाता है जब नियंत्रण विरासत में मिलता है Selector, उदाहरण के लिए, TabControlWPF में। यह क्षेत्र में सक्रिय अभ्यावेदन के साथ चयनित तत्वों में मिलान के लिए जिम्मेदार है।

TabControlRegionSyncBehaviorइसी तरह SelectorItemsSourceSyncBehavior, और इसके बजाय सिल्वरलाइट में उपयोग किया जाता है।

क्षेत्रों की कार्यक्षमता का विस्तार

प्रिज्म में विस्तार बिंदु होते हैं जो आपको प्रदान किए गए एपीआई के मानक व्यवहार को विस्तारित या ओवरराइड करने की अनुमति देते हैं। उदाहरण के लिए, आप अपने स्वयं के क्षेत्रीय एडेप्टर, क्षेत्र के व्यवहार को लिख सकते हैं, जिस तरह से नेविगेशन एपीआई पार्स URIs को बदल सकते हैं, या सिल्वरलाइट फ़्रेम नेविगेशन के साथ काम करने के लिए नेविगेशन एपीआई का विस्तार कर सकते हैं अधिक जानकारी के लिए, प्रसार प्रिज्म देखें

प्रस्तुति रचना


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

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

डिटेक्शन अभ्यावेदन ( देखें डिस्कवरी )

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

अभ्यावेदन की शुरूआत ( देखें लें इंजेक्शन )

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

नेविगेशन

प्रिज्म लाइब्रेरी 4.0 में नेविगेशन एपीआई हैनेविगेशन एपीआई URI को नेविगेट करके विचारों को लागू करना आसान बनाता है। नेविगेशन एपीआई एक दृश्य बनाता है, इसे क्षेत्र में जोड़ता है, और इसे सक्रिय करता है। इसके अतिरिक्त, नेविगेशन एपीआई आपको इस क्षेत्र में पहले से निर्मित विचारों पर नेविगेट करने की अनुमति देता है। अधिक जानकारी के लिए भाग 8, "नेविगेशन" देखें

दृश्य खोज का उपयोग कब करना है और विचार कब प्रस्तुत करना है

क्षेत्र लोडिंग रणनीति का विकल्प आवेदन की आवश्यकताओं और क्षेत्र के कार्य पर निर्भर करता है।

निम्नलिखित स्थितियों में दृश्य पहचान का उपयोग किया जा सकता है:



कार्यान्वयन दृश्य:



UI बिल्ड परिदृश्य


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

इंटरफ़ेस में उनके प्रदर्शन के निरूपण और स्थानों का पृथक्करण क्षेत्रों में लोड किए गए अभ्यावेदन का स्वतंत्र रूप से विकास करने के लिए आवेदन की उपस्थिति और लेआउट की अनुमति देता है।

निम्नलिखित अनुभाग उन मुख्य परिदृश्यों का वर्णन करते हैं जिन्हें आप समग्र अनुप्रयोगों को विकसित करते समय सामना करेंगे। यदि आवश्यक हो, तो स्टॉक ट्रेडर आरआई के उदाहरण इन परिदृश्यों के समाधान का प्रदर्शन करेंगे।

शैल निर्माण


एक आवरण एक मूल अनुप्रयोग है जिसमें प्राथमिक UI सामग्री होती है। एक WPF आवेदन में, आवरण एक उदाहरण है Windows। सिल्वरलाइट में - RootVisualUserControl

एक शेल में नामित क्षेत्र हो सकते हैं जिसमें मॉड्यूल आवश्यक अभ्यावेदन का स्थान ले सकते हैं। यह कुछ उच्च-स्तरीय UI तत्वों को भी परिभाषित कर सकता है, जैसे कि मुख्य मेनू और टूलबार। शेल ASP.NET मास्टर पृष्ठों के समान ही मूल संरचना और अनुप्रयोग की प्रस्तुति को परिभाषित करता है। यह शैल में दिखाई देने वाली शैलियों, सीमाओं को निर्दिष्ट कर सकता है, यह शैल में लोड किए गए विचारों पर लागू होने वाली शैली, टेम्पलेट और थीम भी सेट कर सकता है।

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

आपके पास एक अनुप्रयोग में एक से अधिक शेल हो सकते हैं। यदि एप्लिकेशन इस तरह से डिज़ाइन किया गया है जो उपयोगकर्ताओं को एक से अधिक उच्च-स्तरीय विंडो खोलने की अनुमति देता है, तो ऐसी प्रत्येक विंडो अपनी सामग्री के लिए शेल के रूप में कार्य कर सकती है।

Stock Trader RI

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

स्टॉक ट्रेडर आरआई में शेल, क्षेत्र और दृश्य

शेल का कार्यान्वयन फ़ाइल में प्रस्तुत किया गया है , इसकी अलग कोड फ़ाइल , और प्रस्तुति मॉडल में भी इसमें मार्कअप और यूआई तत्व शामिल हैं जो शेल का हिस्सा हैं, जिसमें उन क्षेत्रों की परिभाषाएं शामिल हैं जिनमें मॉड्यूल दृश्य जोड़ते हैं।Shell.xamlShell.xaml.csShellViewModel.csShell.xaml

निम्नलिखित XAML शेल में परिभाषित संरचना और मूल तत्वों को दर्शाता है। संलग्न संपत्ति RegionNameक्षेत्रों को निर्धारित करने के लिए कार्य करती है, और विंडो की पृष्ठभूमि छवि शेल की पृष्ठभूमि छवि है।

XAML Shell.xaml (WPF)
 <Window x:Class="StockTraderRI.Shell"> <!—shell background --> <Window.Background> <ImageBrush ImageSource="Resources/background.png" Stretch="UniformToFill"/> </Window.Background> <Grid> <!--  --> <Canvas x:Name="Logo"> <TextBlock Text="CFI" ... /> <TextBlock Text="STOCKTRADER" .../> </Canvas> <!--    --> <ItemsControl x:Name="MainToolbar" cal:RegionManager.RegionName="{x:Static inf:RegionNames.MainToolBarRegion}"> </ItemsControl> <!--  --> <Grid> <Controls:AnimatedTabControl x:Name="PositionBuySellTab" cal:RegionManager.RegionName="{x:Static inf:RegionNames.MainRegion}"/> </Grid> <!--  --> <Grid> <ContentControl x:Name="ActionContent" cal:RegionManager.RegionName="{x:Static inf:RegionNames.ActionRegion}"> </ContentControl> </Grid> <!--   --> <Grid x:Name="SideGrid"> <Controls:ResearchControl cal:RegionManager.RegionName="{x:Static inf:RegionNames.ResearchRegion}"> </Controls:ResearchControl> </Grid> </Grid> </Window> 

कार्यान्वयन Shell.xaml.csबहुत सरल है। Shellनिर्यात योग्य है, जो इसे बूटलोडर द्वारा बनाने की अनुमति देता है। इसकी निर्भरता MEF द्वारा हल की जाती है। शेल पर एक एकल निर्भरता है ShellViewModel, जो MEF का उपयोग करके निर्माण के दौरान कार्यान्वित की जाती है।

C # Shell.xaml.cs
 [Export] public partial class Shell : Window { public Shell() { InitializeComponent(); } [Import] ShellViewModel ViewModel { set { this.DataContext = value; } } } 


C # ShellViewModel.cs
 [Export] public class ShellViewModel : NotificationObject { //        . } 

कोड-बैक फ़ाइल में कोड की मात्रा से, आप समग्र अनुप्रयोगों की वास्तुकला की शक्ति और सादगी, और शेल और विचारों के बीच संबंध की कमजोरी का मूल्यांकन कर सकते हैं।

क्षेत्रों की स्थापना


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

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

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

खोल खाली

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

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

स्टॉक ट्रेडर आरआई शेल में क्षेत्र

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

Stock Trader RI

में एक बहु-दृश्य दृष्टिकोण देखा जा सकता है खरीदें / बेचें क्षेत्र एक सूची जैसा क्षेत्र है जिसमें इसे सूची आइटम के रूप में दिखाया गया है, जैसा कि नीचे दिखाया गया है। खोल क्षेत्र शामिल हैं बटन होते हैं सभी जमा करें और रद्द करें सभी , साथ ही क्षेत्र OrderCompositeView

ItemsControl

ActionRegionOrdersViewOrdersViewOrdersRegionOrdersRegionएक नियंत्रण से जुड़ा हुआ है जो ListBoxकई दृश्य दिखाता है OrderCompositeViews

IRegion इंटरफ़ेस

एक क्षेत्र एक वर्ग है जो एक इंटरफ़ेस को लागू करता है IRegionएक क्षेत्र एक कंटेनर है जिसमें नियंत्रण में प्रदर्शित करने के लिए सामग्री होती है। निम्न कोड दिखाता है कि इस इंटरफ़ेस में क्या निहित है।

 public interface IRegion : INavigateAsync, INotifyPropertyChanged { IViewsCollection Views { get; } IViewsCollection ActiveViews { get; } object Context { get; set; } string Name { get; set; } Comparison<object> SortComparison { get; set; } IRegionManager Add(object view); IRegionManager Add(object view, string viewName); IRegionManager Add(object view, string viewName, bool createRegionManagerScope); void Remove(object view); void Deactivate(object view); object GetView(string viewName); IRegionManager RegionManager { get; set; } IRegionBehaviorCollection Behaviors { get; } IRegionNavigationService NavigationService { get; set; } } 

क्षेत्रों को XAML में जोड़ना

RegionManagerएक संलग्न संपत्ति प्रदान करता है जिसे आसानी से XAML में एक क्षेत्र बनाने के लिए इस्तेमाल किया जा सकता है। इस दृष्टिकोण का उपयोग करने के लिए, आपको XAML में प्रिज्म नामस्थान जोड़ना होगा और संलग्न संपत्ति का उपयोग करना होगा RegionName। निम्न उदाहरण से पता चलता है कि किसी क्षेत्र को एक तत्व के साथ कैसे जोड़ा जाए AnimatedTabControl

क्षेत्र के नाम के साथ एक स्ट्रिंग प्राप्त करने के लिए MainRegion, मार्कअप एक्सटेंशन का उपयोग किया जाता है x:Static। यह XAML में जादू के तार के उपयोग से बचा जाता है।

 <Controls:AnimatedTabControl x:Name="PositionBuySellTab" cal:RegionManager.RegionName="{x:Static inf:RegionNames.MainRegion}"/> 

सिल्वरलाइट 4 उपयोग की अनुमति नहीं देता है x:Staticइसलिए, आपको क्षेत्रों को निर्दिष्ट करने के लिए स्ट्रिंग मानों का उपयोग करना होगा, या, यदि वांछित है, तो पूरे आवेदन के लिए उपलब्ध स्ट्रिंग संसाधनों को निर्धारित करें जिसमें ये नाम शामिल होंगे। RegionNameइस दृष्टिकोण का उपयोग करके संलग्न संपत्ति , क्षेत्र का नाम प्राप्त करने के लिए इस तरह के संसाधन से जुड़ी हो सकती है।

 <Controls:AnimatedTabControl Regions:RegionManager.RegionName="MainRegion" /> 

कोड में क्षेत्रों को जोड़ना

RegionManagerXAML का उपयोग किए बिना, कोड में सीधे क्षेत्रों को पंजीकृत करना संभव है। निम्नलिखित कोड उदाहरण दिखाता है कि किसी क्षेत्र को एक अलग कोड फ़ाइल में नियंत्रण के साथ कैसे जोड़ा जाए। आरंभ करने के लिए, आपको क्षेत्र प्रबंधक से एक लिंक प्राप्त करना होगा। फिर, स्थैतिक विधि का उपयोग करके RegionManager.SetRegionManagerऔर RegionManager.SetRegionName, क्षेत्र नियंत्रण के साथ जुड़ा हुआ है ActionContent, जिसके बाद इसका नाम "ActionRegion" पर सेट किया गया है

 IRegionManager regionManager = ServiceLocator.Current.GetInstance<IRegionManager>(); RegionManager.SetRegionManager(this.ActionContent, regionManager); RegionManager.SetRegionName(this.ActionContent, "ActionRegion"); 

इसे लोड करते समय क्षेत्र में दृश्य प्रदर्शित करना


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

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

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

निम्नलिखित दृष्टांत दृश्य खोज दृष्टिकोण को दर्शाता है।



Prims RegionViewRegistryनामित क्षेत्रों में प्रस्तुतियाँ दर्ज करने के लिए एक मानक रजिस्टर वर्ग प्रदान करता है

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

 this.regionManager.RegisterViewWithRegion("MainRegion", typeof(EmployeeView)); 

आप आवश्यक प्रतिनिधि भी प्रदान कर सकते हैं, जैसा कि नीचे दिखाया गया है। क्षेत्र बनाते समय क्षेत्र प्रबंधक दृश्य प्रदर्शित करेगा।

 this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<EmployeeView>()); 

यूआई संरचना QuickStar में कदम गाइड द्वारा एक कदम है EmployeeModule ModuleInit.csफ़ाइल दर्शाता है कि विधि का उपयोग करने के लिए कैसे RegisterViewWithRegion

प्रोग्राम क्षेत्र में प्रतिनिधित्व प्रदर्शित करें


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



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

 IRegion region = regionManager.Regions["MainRegion"]; var ordersView = container.Resolve<OrdersView>(); region.Add(ordersView, "OrdersView"); region.Activate(ordersView); 

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

नेविगेशन

प्रिज़्म लाइब्रेरी 4.0 में एक नेविगेशन एपीआई शामिल है जो WPF या सिल्वरलाइट अनुप्रयोगों को नेविगेट करने के लिए एक समृद्ध और सुसंगत दृष्टिकोण प्रदान करता है।

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

निम्न कोड दिखाता है कि स्टॉक ट्रेडर आरआई उदाहरण का उपयोग करके ArticleViewModelनेविगेशन अनुरोध कैसे शुरू किया जाए।

 this.regionManager.RequestNavigate(RegionNames.SecondaryRegion, new Uri("/NewsReaderView", UriKind.Relative)); 

अधिक जानकारी के लिए, भाग 8, नेविगेशन अनुभाग देखें। नेविगेशन-स्विचिंग नेविगेशन QuickStart और राज्य-आधारित नेविगेशन QuickStart भी इस दृष्टिकोण के उदाहरण हैं।

एक क्षेत्र में दृश्य क्रम


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

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

यह देखने के लिए कि क्षेत्र में दृश्य कैसे स्थित हैं, प्रिज्म एक विशेषता प्रदान करता है ViewSortHint। इसमें एक स्ट्रिंग प्रॉपर्टी होती है।Hint, जो इस क्षेत्र में स्थित होना चाहता है के बारे में एक संकेत देने के लिए अनुमति देता है।

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

यदि आप क्षेत्र के अनुसार विचारों को बदलना चाहते हैं, तो वर्ग के Regionपास एक संपत्ति SortComparisonहै जिसके माध्यम से आप अपना प्रतिनिधि सेट कर सकते हैं Comparison<object>। यह ध्यान रखना महत्वपूर्ण है कि किसी क्षेत्र के गुणों को छाँटना ViewsऔरActiveViewsइस तथ्य के कारण UI पर परिलक्षित होता है कि एडेप्टर जैसे कि ItemsControlRegionAdapterइन गुणों से सीधे जुड़ते हैं। एक कस्टम एडेप्टर अपनी स्वयं की छँटाई विधि को लागू कर सकता है, जो क्षेत्र में किए गए विचारों की छँटाई को पार कर जाएगा।

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

 [Export] [ViewSortHint("01")] public partial class EmailNavigationItemView { … } [Export] [ViewSortHint("02")] public partial class CalendarNavigationItemView { … } [Export] [ViewSortHint("03")] public partial class ContactsDetailNavigationItemView { … } [Export] [ViewSortHint("04")] public partial class ContactsAvatarNavigationItemView { … } 

कई क्षेत्रों के बीच डेटा का आदान-प्रदान


Prims आपके परिदृश्य के आधार पर विचारों के बीच बातचीत करने के लिए कई दृष्टिकोण प्रदान करता है। क्षेत्र प्रबंधक RegionContextऐसे दृष्टिकोणों में से एक के रूप में एक संपत्ति प्रदान करता है

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

नोट।
DataContextप्रस्तुति के लिए स्थानीय डेटा संदर्भ सेट करने के लिए सिल्वरलाइट और WPF में संपत्ति का उपयोग किया जाता है। यह दृश्य मॉडल, स्थानीय प्रस्तोता या मॉडल के साथ बातचीत करने के लिए डेटा बाइंडिंग का उपयोग करने की अनुमति देता है। RegionContextकई दृश्यों में संदर्भ साझा करने के लिए उपयोग किया जाता है और एक भी दृश्य के लिए स्थानीय नहीं है। यह कई विचारों के बीच संदर्भ साझा करने के लिए एक सरल तंत्र प्रदान करता है।

निम्न कोड दिखाता है कि RegionContextXAML में संलग्न संपत्ति का उपयोग कैसे किया जाता है।

 <TabControl AutomationProperties.AutomationId="DetailsTabControl" cal:RegionManager.RegionName="{x:Static local:RegionNames.TabRegion}" cal:RegionManager.RegionContext="{Binding Path=SelectedEmployee.EmployeeId}" ... > 

आप RegionContextनीचे दिखाए अनुसार कोड में भी स्थापित कर सकते हैं।

 RegionManager.Regions["Region1"].Context = employeeId; 

एक दृश्य में संदर्भ प्राप्त करने के लिए, आप स्थैतिक विधि का उपयोग कर सकते हैं RegionContext.GetObservableContextयह एक पैरामीटर के रूप में दृश्य लेता है, जिसके बाद संदर्भ को संपत्ति के माध्यम से एक्सेस किया जा सकता है Value, जैसा कि नीचे दिखाया गया है।

 private void GetRegionContext() { this.Model.EmployeeId = (int)RegionContext.GetObservableContext(this).Value; } 

RegionContextसंपत्ति के लिए बस एक नया मूल्य निर्धारित करके मूल्य को बदला जा सकता है Valueदृश्य PropertyChangedउस प्रकार के ऑब्जेक्ट की घटना का उपयोग करके संदर्भ परिवर्तन सूचनाओं की सदस्यता ले ObservableObjectसकते हैं जो विधि को कॉल करके प्राप्त की जा सकती हैं GetObservableContextजब संदर्भ बदलता है तो यह कई विचारों को सिंक्रनाइज़ करने की अनुमति देता है। निम्न उदाहरण दिखाता है कि संदर्भ परिवर्तनों की सदस्यता कैसे लें।

 ObservableObject<object> viewRegionContext = RegionContext.GetObservableContext(this); viewRegionContext.PropertyChanged += this.ViewRegionContext_OnPropertyChangedEvent; private void ViewRegionContext_OnPropertyChangedEvent(object sender, PropertyChangedEventArgs args) { if (args.PropertyName == "Value") { var context = (ObservableObject<object>) sender; int newValue = (int)context.Value; } } 

नोट।
RegionContext , , , DependencyObject . , , DependencyObject . , , , . , RegionContext , DependencyObject .


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

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



एक क्षेत्र प्रबंधक के लिए एक स्थानीय प्रबंधक बनाने के लिए, आपको यह निर्दिष्ट करना होगा कि RegionManagerक्षेत्र में एक क्षेत्र जोड़ते समय एक नया बनाया जाना चाहिए, जैसा कि नीचे दिखाया गया है।

 IRegion detailsRegion = this.regionManager.Regions["DetailsRegion"]; View view = new View(); bool createRegionManagerScope = true; IRegionManager detailsRegionManager = detailsRegion.Add(view, null, createRegionManagerScope); 

ऐड मेथड एक नया रीजन मैनेजर देता है जिसके साथ व्यू लोकल स्कोप से रीजन तक पहुंचने के लिए बचा सकता है।

दृश्य बनाएँ


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

,        Stock Trader RI

उपयोगकर्ता नियंत्रण

एक्सप्रेशन ब्लेंड और विज़ुअल स्टूडियो 2010-2012 दोनों इन नियंत्रणों को बनाने के लिए समृद्ध समर्थन प्रदान करते हैं। प्रिज़्म का उपयोग करते समय उपयोगकर्ता इंटरफ़ेस बनाने के लिए इन उपकरणों का उपयोग करके बनाए गए उपयोगकर्ता नियंत्रणों की सिफारिश की जाती है। जैसा कि पहले उल्लेख किया गया है, स्टॉक ट्रेडर आरआई क्षेत्रीय सामग्री बनाने के लिए उनका व्यापक उपयोग करता है। WatchListView.xaml उपयोगकर्ता नियंत्रण एक अच्छा उदाहरण है कि उपयोगकर्ता इंटरफ़ेस के एक छोटे हिस्से को वॉचमॉड्यूल मॉड्यूल के अंदर कैसे रखा जा सकता है। ये नियंत्रण बनाने और उपयोग करने के लिए बहुत सरल और सीधे हैं।

विशेष नियंत्रण ( कस्टम नियंत्रण )

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

टेम्पलेट्स डेटा ( डेटा टेम्पलेट्स )

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

अभिव्यक्ति ब्लेंड में नेत्रहीन डेटा टेम्प्लेट बनाने के लिए पूर्ण समर्थन है। Visual Studio 2010 केवल XAML के माध्यम से संपादन डेटा टेम्प्लेट प्रदान करता है। विजुअल स्टूडियो 2012 में, विज़ुअल एडिटर एक्सप्रेशन ब्लेंड से लिया गया है, इसलिए, डेटा टेम्प्लेट के लिए लगभग वही समर्थन प्रदान किया जाता है, जैसा कि एक्सप्रेशन ब्लेंड में है।

संसाधन ( संसाधन )

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



अनुप्रयोग स्तर संसाधन

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

मॉड्यूल स्तर के संसाधन

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

नियंत्रण स्तर संसाधन

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

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


All Articles