2011-05-26 26 views
46

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

मेरी आंखों के लिए, वे बिल्कुल समान हैं। जैसा कि मैं शुरुआती हूं, मुझे लगता है कि मैं गलत हूं, इस प्रकार मेरा प्रश्न।

+1

संबंधित: [आइटम टेम्पलेट बनाम कंट्रोल टेम्पलेट] (http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen

+2

एमएसडीएन संसाधन, शैलियों और टेम्पलेट्स के बीच अंतर: http://msdn.microsoft.com/ en-us/library/cc295273% 28v = अभिव्यक्ति.40% 29.aspx –

उत्तर

23

वास्तव में आप वास्तव में गलत नहीं हैं। शैलियों नियंत्रण पर गुण सेट करें। ControlTemplate एक संपत्ति है जो अधिकांश नियंत्रणों द्वारा साझा की जाती है जो निर्दिष्ट करती हैं कि उन्हें कैसे प्रदान किया जाता है।

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

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

अद्यतन:

को समझने के लिए कैसे शैलियाँ और ControlTemplates "नियंत्रण जोड़ने" कर सकते हैं। किसी भी तरह से या किसी अन्य, नियंत्रण टेम्पलेट नियंत्रण को परिभाषित करने का एकमात्र तरीका है जो नियंत्रण से बना है। लेकिन, कुछ डिफ़ॉल्ट .net नियंत्रण आपको पाठ के स्थान पर नियंत्रण का उपयोग करने की अनुमति देते हैं।

उदाहरण के लिए:

<GroupBox> 
    <GroupBox.Header> 
    <CheckBox/> 
    </GroupBox.Header> 
</GroupBox> 

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

हालांकि, कभी-कभी नियंत्रण के लिए डिफ़ॉल्ट नियंत्रण टेम्पलेट आपको ऐसी चीज़ों को बदलने की अनुमति नहीं देता है जिन्हें आप गुणों के माध्यम से बदलना चाहते हैं। फिर आपको ControlTemplate को बदलना होगा।

चाहे आप सीधे नियंत्रण या सामग्री के माध्यम से नियंत्रण की सामग्री सेट करते हैं (सामग्री, शीर्षलेख, नियंत्रण टेम्पलेट, IsEnabled, आदि) इससे कोई फर्क नहीं पड़ता, स्टाइल केवल एक सुविधा है।

उम्मीद है कि यह आपके प्रश्न का अधिक स्पष्ट रूप से उत्तर देगा।

+1

ठीक है, लेकिन प्रोजेक्ट में मैं काम कर रहा हूं, दोनों का उपयोग कुछ नियंत्रणों में अन्य नियंत्रण जोड़ने के लिए किया गया था ... और गुणों को सेट करने के लिए भी ... तो मुझे उनके उपयोग में अंतर नहीं दिख रहा है? ? ? –

53

एक शैली में आप नियंत्रण के गुण सेट करते हैं।

<Style x:Key="MyButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

<Button Style="{StaticResource MyButtonStyle}"/> 

इस शैली का उपयोग करने वाले सभी बटनों में उनकी पृष्ठभूमि लाल हो जाएगी।

एक टेम्पलेट में आप नियंत्रण के यूआई (संरचना) को परिभाषित करते हैं।

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="Green"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

<Button Template="{StaticResource MyButtonTemplate}"/> 

इस टेम्पलेट का उपयोग करने वाले सभी बटनों में एक हरा पृष्ठभूमि होगी जिसे बदला नहीं जा सकता है।

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

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="{TemplateBinding Background}"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

अब टेम्पलेट बटन इसे करने के लिए लागू किया जाता है की पृष्ठभूमि संपत्ति के मूल्य का उपयोग करता है, तो यह अनुकूलित किया जा सकता:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/> 

एक और उपयोगी सुविधा है कि नियंत्रण एक डिफ़ॉल्ट शैली उठा सकते हैं उन्हें एक विशिष्ट शैली के बिना सौंपा जा रहा है। आप टेम्पलेट के साथ ऐसा नहीं कर सकते हैं।

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

टेम्पलेट्स और शैलियों के संयोजन अतिरिक्त शक्तिशाली है:

<Style TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <Rectangle Fill="{TemplateBinding Background"/> 
        <ContentPresenter/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+3

तो आपका उदाहरण बिल्कुल उस प्रश्न के अनुरूप है जो मैं सोच रहा हूं ... नियंत्रण टेम्पलेट और एक शैली के बीच क्या अंतर है जो केवल एक नियंत्रण टेम्पलेट को निश्चित करता है? स्टाइल द्वारा हमेशा नियंत्रण टेम्पलेट को समाहित करना आम बात है? –

13

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

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

रेफरी: http://msdn.microsoft.com/en-us/library/ms745683.aspx

0

ठीक है, मैं ठीक उसी सवाल था और जवाब मैं इस सूत्र में पाया मुझे सही दिशा में इशारा किया तो मैं, साझा कर रहा है, तो केवल इसलिए मैं यह बेहतर अपने आप को समझ सकते हैं।

एक शैली ControlTemplate से अधिक लचीला है।

विंडोज प्रस्तुति फाउंडेशन से

Unleashed, एडम नाथन और गिरोह (लेखकों) इस राज्य:

  • "मनमाना संपत्ति के साथ [शैली के ControlTemplate सेटर का उपयोग कर एक शैली के साथ] एक टेम्पलेट के संयोजन की सुविधा के अलावा सेटिंग्स, वहाँ ऐसा करने [एक शैली पर ControlTemplate सेटर की स्थापना] के महत्वपूर्ण लाभ हैं:।

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

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

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

2

मैं The difference between styles and templates (msdn)

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

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


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

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

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