2015-03-29 7 views
18

मैं WinRT में कस्टम नियंत्रण बनाने के तरीके पर कुछ ट्यूटोरियल देख रहा था, और मेरे पास एक प्रश्न है।उपयोगकर्ता नियंत्रण पर टेम्पलेट नियंत्रण का उपयोग कब करें?

मान लें कि मैं एक साधारण नियंत्रण बनाना चाहता हूं जिसमें कुछ सामान शामिल हैं, जैसे बाईं ओर एक छवि के साथ ग्रिड और दाईं ओर कुछ टेक्स्टब्लॉक।

मेरा मतलब है, कुछ सरल की तरह:

<Grid Height="100"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0.3*"/> 
     <ColumnDefinition Width="0.7*"/> 
    </Grid.ColumnDefinitions> 
    <Image Source"/Assets/someRandomImage.png"/> 
    <StackPanel Grid.Column="1" 
       VerticalAlignment="Center"> 
     <TextBlock Text="Some text" 
        Margin="10,0,10,0" 
        FontSize="24" 
        FontWeight="SemiLight" 
        TextTrimming="CharacterEllipsis"/> 
     <TextBlock Text="Some random description..." 
        Margin="10,5,10,0" 
        FontSize="18" 
        FontWeight="Light" 
        Foreground="Gray" 
        TextWrapping="Wrap" 
        TextTrimming="CharacterEllipsis"/> 
    </StackPanel> 
</Grid> 

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

फिर मैंने देखा कि एक और दृष्टिकोण टेम्पलेट नियंत्रण का उपयोग करना होगा, इसलिए मुझे नियंत्रण कक्षा से विरासत में एक कक्षा बनाना होगा, फिर उपरोक्त XAML कोड को टेम्पलेट के रूप में उपयोग करें और इसे कस्टम नियंत्रण पर लागू करें और वहां बाकी सभी तर्क जोड़ें।

बेशक, मुझे उन लोगों के साथ बातचीत करने में सक्षम होने के लिए नियंत्रण में कुछ यूआईएलमेंट्स को एक्स: नाम संपत्ति भी जोड़नी होगी, लेकिन आपको यह विचार मिल जाएगा।

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

आपकी मदद के लिए धन्यवाद, मुझे लगता है कि मैं इस संदेह के साथ केवल एक नहीं हूँ, इसलिए मुझे आशा है कि इस सवाल का दूसरों के रूप में अच्छी तरह से मदद मिलेगी: डी

सर्जियो

+1

क्या आप UserControl में कार्यक्षमता जोड़ते हैं? या बस एक मौजूदा नियंत्रण कैसे प्रदर्शित किया जाता है? उत्तरार्द्ध के लिए भी एक नियंत्रण टेम्पलेट पर्याप्त होगा http://www.wpftutorial.net/templates.html – treze

+0

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

+0

एक और नोट - आप वीएस या ब्लेंड में डिज़ाइन व्यू में टेम्पलेटेड नियंत्रण देख सकते हैं, जब तक उनके पास कोई तर्क न हो जो डिज़ाइन व्यू को तोड़ देगा। आपको केवल 'UserControl'/'पृष्ठ' में अपने नियंत्रण का एक उदाहरण उपयोग करना होगा और इसे दिखाना चाहिए। –

उत्तर

21

UserControl

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

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

  • यह आमतौर पर एकल ऐप के दायरे में ही पुन: प्रयोज्य होता है।

कस्टम नियंत्रण

  • एक custom control या कुछ मामलों में templated control सबसे अच्छा यूआई का एक छोटा सा हिस्सा है कि एक ही उद्देश्य में कार्य करता लिए अनुकूल है - यह जानकारी का एक एकल, विशिष्ट प्रकार की परिकल्पना करती।
  • एक टेम्पलेट नियंत्रण अपने टेम्पलेट को विशेष उपयोग केस के दृश्यों को समायोजित करने के लिए बदल सकता है। यह आपको एक ऐसा बटन रखने की अनुमति देता है जो एक ऐप में एक डिफ़ॉल्ट बटन जैसा दिखता है, एक गोलाकार एक दूसरे में और एक पूरी तरह से छवियों में से एक बना देता है। यह अधिक पुन: प्रयोज्य बनाता है जो समझ में आता है यदि आप एक से अधिक ऐप बनाते हैं या दुनिया के साथ अपना कमाल नियंत्रण साझा करना चाहते हैं।
  • एक अच्छी तरह लिखित कस्टम नियंत्रण आमतौर पर एक से अधिक ऐप में पुन: प्रयोज्य है क्योंकि यह विशेष ऐप के व्यावसायिक तर्क पर निर्भर नहीं है।
  • यह आमतौर पर एक मौजूदा मंच नियंत्रण से निकला है, Button जैसे, ToggleButton, ContentControl, Slider, TextBox या ListView को जोड़ने के लिए या अपने तर्क ओवरराइड करने के लिए। ऐसे मामले हैं, जब इसे स्क्रैच से बनाने के लिए समझ में आता है, "वर्चुअल अमूर्त" Control, ItemsControl, RangeBase, Shape या FrameworkElement (अंतिम दो टेम्पलेट नहीं किए गए हैं) को उप-वर्गीकृत करना।
  • टेम्पलेट लोड होने पर टेम्पलेट नियंत्रण के दृश्य पेड़ को लोड किया जाता है, जो तब तक हो सकता है जब नियंत्रण की दृश्यता पहले Collapsed से Visible में परिवर्तित हो जाती है जो प्रदर्शन सुधार प्राप्त करने के लिए आपके यूआई के लोडिंग भागों को स्थगित करने की अनुमति देती है।
  • क्योंकि नियंत्रण टेम्पलेट केवल एक बार लोड होता है, ये किसी भी आइटम नियंत्रण डेटा टेम्पलेट (सूचियों, ग्रिडव्यू, आदि) के अंदर उपयोग के लिए आदर्श हैं। यदि आप UserControl का उपयोग करना चाहते थे, तो आपका प्रदर्शन वास्तव में पीड़ित हो सकता है क्योंकि UserControl XAML को बार-बार पार्स किया जाता है।

कस्टम पैनल

एक custom panel अभी तक यूआई तत्व का एक और प्रकार है कि अनुकूलित करने के लिए कैसे वह अपने बच्चों को बाहर देता है की अनुमति देता है।

+0

आपका दावा है कि उपयोगकर्ता नियंत्रण आमतौर पर केवल एक ऐप के दायरे में पुन: प्रयोज्य होते हैं, यह सच नहीं है। मेरे पास उपयोगकर्ता नियंत्रण हैं जो मेरी सभी परियोजनाओं में पूरी तरह से पुन: प्रयोज्य हैं। शेष के लिए मैं ज्यादातर सहमत हूं, मैं उस कथन को हटा दूंगा। –

+0

ओह, मेरे पास उपयोगकर्ता नियंत्रण भी हैं जो विभिन्न परियोजनाओं में पुन: प्रयोज्य हैं, लेकिन आम तौर पर आप इन प्रदर्शन सुधार और अनुकूलन समर्थन लाभ प्राप्त करने के लिए अंततः इन टेम्पलेट को बनाने का प्रयास करते हैं। ध्यान दें कि 'पृष्ठ' भी 'UserControl' है, इसलिए जब तक आपके पास ऐसे ऐप्स नहीं हैं जो पूरे पृष्ठ साझा करते हैं - आप आमतौर पर इन प्रति ऐप का उपयोग करते हैं। यदि आपको लगता है कि आपके पास बहुत से 'UserControls' हैं जो ऐप्स के बीच साझा किए जाते हैं - उन्हें टेम्पलेट और शायद ओपन सोर्स बनाने पर विचार करें। मैंने देखा है कि किसी ने यूके में प्रत्येक फुटबॉल क्लब के लिए एक संस्करण के साथ एक ऐप बनाया है - उन्होंने शायद सभी 'पन्ने' साझा किए हैं, लेकिन यह अद्वितीय है ... –

+0

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

3

एक उपयोगकर्ता नियंत्रण बनाना एक बहुत है एक कस्टम नियंत्रण बनाने से सरल है। स्टार्टर्स के लिए उपयोगकर्ता नियंत्रण में डिज़ाइनर समर्थन होता है। उपयोगकर्ता नियंत्रण का नुकसान यह है कि यह एक कस्टम नियंत्रण की तुलना में सीमित है।

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

तो संक्षेप में 'सरल' नियंत्रण जटिल नियंत्रण के लिए उपयोगकर्ता नियंत्रण के लिए उपयोगकर्ता नियंत्रण में। कोई भी उपयोगकर्ता नियंत्रण कस्टम नियंत्रण द्वारा बनाया जा सकता है लेकिन अन्य तरीकों से नहीं।

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