2009-07-15 23 views
37

मैं हाल ही में एक UserControl है, जो काफी समय ले लिया कर दिया है क्योंकि मैं फिर भी कस्टम निर्भरता गुण के साथ काम करने और इतने पर ...WPF ControlTemplate बनाम UserControl

था, यह सिर्फ एक गुच्छा था 3 नियंत्रणों में: टेक्स्टबॉक्स, पदानुक्रमित वृक्ष के साथ पॉपअप।

अब मुझे एहसास हुआ कि मैं शायद नियंत्रण टेम्पलेट लिख सकता हूं। इसलिए उपयोगकर्ता नियंत्रण का उपयोग करने का लाभ क्या है?

उत्तर

54

यहां पर विचार करने के तीन मामले हैं: UserControl, ControlTemplate, और कस्टम नियंत्रण। (मुझे लगता है कि डेटा टेम्पलेट को कोई स्पष्टीकरण की आवश्यकता नहीं है)

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

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

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

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

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

(MVVM बारे में अधिक जानकारी, जैसी कई अन्य के लिए, जोश स्मिथ, साचा नाई और कार्ल Shifflett की शानदार लेख के लिए गूगल)

3

यदि आप अपनी निर्भरता गुण जोड़ रहे हैं, तो आपको अपनी खुद की कक्षा की आवश्यकता होगी जिस पर उन्हें परिभाषित किया जाए।

जैसा कि आप कक्षा में एक टेम्पलेट लागू करना चाहते हैं, इस कस्टम क्लास को Control (UserControl करता है) से प्राप्त करना होगा।

अपना खुद का Control लिखने का मुख्य लाभ यह है कि यह आपके टेम्पलेट को अन्य उपयोग परिदृश्यों के लिए फिर से परिभाषित कर सकता है, या तो आप ऐप के भीतर या प्रकार के अन्य उपयोगकर्ताओं द्वारा।

UserControl कक्षा का उपयोग करने में बहुत कम ओवरहेड है। वास्तव में, यदि आप इसे Reflector.NET में देखते हैं, तो आप देखेंगे कि इसमें शायद ही कोई कोड है। जाहिर है, UserControl बस कुछ मौजूदा निर्भरता गुणों पर मेटाडाटा को पुनर्परिभाषित (जैसे FocusablePropertyfalse का डिफ़ॉल्ट मान बनाने के रूप में।)

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

+0

मैं इसे समझते हैं कि प्राथमिक अंतर यह है कि मुझे लगता है कि नियंत्रण के लिए नई निर्भरता गुण प्रदान कर सकता है। लेकिन मुझे लगता है कि अन्य सभी बदलाव स्टाइल, ट्रिगर्स या टेम्पलेट में सेट किए जा सकते हैं। या? –

संबंधित मुद्दे