ContentControl और ContentPresenter के बीच क्या अंतर है?


208

मुझे यकीन नहीं है कि जब मुझे (और इसके विपरीत) ContentPresenterका उपयोग करना चाहिए ContentControl। फिलहाल, मैं ContentControlअपने जीवन में हर समय बहुत अधिक उपयोग कर रहा हूं DataTemplateContentPresenterबेहतर विकल्प कब होगा ? और क्यों?

जवाबों:


164

ContentControlनियंत्रण के लिए एक आधार वर्ग है जिसमें अन्य तत्व होते हैं और एक Content-property होता है (उदाहरण के लिए, Button)।

ContentPresenter सामग्री को प्रदर्शित करने के लिए नियंत्रण टेम्पलेट्स के अंदर उपयोग किया जाता है।

ContentControl, जब सीधे इस्तेमाल किया जाता है (यह एक बेस क्लास के रूप में इस्तेमाल किया जाना चाहिए), एक नियंत्रण टेम्पलेट है जो सामग्री को प्रदर्शित करने के लिए ContentPresenter का उपयोग करता है।

अंगूठे के मेरे नियम (हर मामले में लागू नहीं, अपने फैसले का उपयोग करें):

  1. अंदर का ControlTemplateउपयोगContentPresenter
  2. बाहर ControlTemplate(सहित DataTemplateऔर बाहर टेम्पलेट्स) उनमें से किसी का उपयोग न करने की कोशिश करें, यदि आपको आवश्यकता है, तो आपको पसंद करना चाहिएContentPresenter
  3. उपवर्ग ContentControlआप एक कस्टम "lookless" नियंत्रण कि मेजबान सामग्री बना रहे हैं और आप एक मौजूदा नियंत्रण के टेम्पलेट बदलकर एक ही परिणाम प्राप्त नहीं कर सकता है, तो (जो अत्यंत दुर्लभ होना चाहिए)।

1
क्या इसका मतलब यह है कि सामान्य तौर पर, मुझे शायद अपने डेटाटेम्पलेट्स के अंदर कन्टैंटसेंटर का उपयोग करना चाहिए, क्योंकि यह अधिक लाइट-वेट (लेकिन इस तरह से डेटाटेम्पलेट में उपयोग किए जाने पर कार्यात्मक रूप से समतुल्य है)? अगर मैं एक नया नियंत्रण लिख रहा हूं तो बस एक आधार वर्ग के रूप में ContentControl का उपयोग करें?
विल्का

मैंने अधिक विवरण के साथ उत्तर संपादित किया है, जब मैं ContentPresenter का उपयोग करूंगा और जब ContentControl
Nir

1
ठीक है मुझे विचार आया कि ContentPresenter का उपयोग ContentControl के बजाय टेम्प्लेट में किया जाना चाहिए, लेकिन क्यों?
SLL

32
@sll - ContentControl "कंटेंट" (उदाहरण: लेबल) को प्रदर्शित करने वाले प्रत्येक नियंत्रण के लिए आधार वर्ग है, सामग्री को प्रदर्शित करने के लिए ContentPresenter, ContentControl द्वारा आंतरिक रूप से उपयोग किया जाने वाला कोड है - इसलिए: 1. ContentPresenter अधिक हल्का है, 2. ContentPresenter डिज़ाइन किया गया है कंट्रोल टेम्प्लेट्स के अंदर इस्तेमाल किया जा सकता है और 3. कंटनेटप्रेशर को इस तरह इस्तेमाल किया जा सकता है, जबकि कंटेंटकंट्रोल को विस्तारित करने के लिए डिज़ाइन किया गया है (विरासत में मिला है)
Nir

23
जब कंटेंट प्रॉपर्टी सेट होने की बात आती है, तो ContentPresenter ContentControl से अलग व्यवहार करता है। जब आप ContentPresenter की सामग्री गुण सेट करते हैं तो इसकी DataContext सामग्री गुण से मेल खाने के लिए बदल जाती है, लेकिन ContentControl का DataContext अप्रभावित रहता है। यह मायने रखता है यदि आपके पास बाइंडिंग के माध्यम से सेट किए गए ContentPresenter पर अन्य गुण हैं, क्योंकि एक बार DataContext में परिवर्तन होने के बाद, सभी बाइंडिंग स्रोत के रूप में उपयोग करते हैं।
15:19 बजे user195275

25

ContentPresenter का उपयोग आमतौर पर ControlTemplate में किया जाता है, कहने के लिए एक प्लेसहोल्डर के रूप में "यहां वास्तविक सामग्री डालें"।

एक ContentControl कहीं भी इस्तेमाल किया जा सकता है, जरूरी नहीं कि एक टेम्पलेट में। यह किसी भी DataTemplate को सौंपे गए सामग्री के प्रकार के लिए परिभाषित करेगा


6
क्या कोई ContentPresenter भी डेटाटैम्पलेट का कारण नहीं बनेगा ताकि वह सामग्री पर लागू हो? क्या इसका प्राथमिक उद्देश्य नहीं है?
ड्रू नोक

1
मिमी ... हाँ, शायद। वैसे भी, बी स्टोलनित्ज़ का स्पष्टीकरण मेरी तुलना में बहुत अच्छा है;)
थॉमस लेवेस्क

आपके रसीले उत्तर से ऐसा लग रहा था कि यह शीघ्रता से समाप्त हो जाएगा: मेरा मानना ​​है कि ContentPresenter का पूरा डिज़ाइन DataTemplate मुद्रास्फीति को केवल "कार्यान्वित" करने के लिए है - ऐसा लगता है कि केवल टेम्पलेट का पता लगाना और उसे फुसला देना, Dataontext की स्थापना करना भी एकमात्र काम है; और तब तक जितना संभव हो सके "गायब" करने की कोशिश कर रहा है (तब तक आप जिस स्थान पर टेम्प्लेटमेंट संपत्तियों की तरह परिवेश गुणों के लिए फुलाया जा सकता है, उसके बाद कंटेंटस्पेस से आ सकते हैं)। आपको अन्य चीजों के बारे में चिंता करने की आवश्यकता नहीं है, और यह सिर्फ एक अपेक्षाकृत पतले तरीके से टेम्पलेट को फुलाता है। (मैं सबसे पतला देख रहा हूँ!)
स्टीवन कोको

9

मैंने हाल ही में अपने ब्लॉग पर इन दोनों नियंत्रणों के बारे में एक पोस्ट लिखी है:

ContentPresenter बनाम ContentControl (EDIT: टूटा हुआ लिंक संग्रहीत संस्करण के साथ बदल दिया गया है।)

ContentPresenter.ContentSource क्या वास्तव में दो वर्गों के बीच सबसे बड़ा अंतर बना देता है। ContentSource संपत्ति केवल एक ControlTemplate के भीतर समझ में आता है; यह निर्धारित करता है कि किस अस्थायी संपत्ति को सामग्री के साथ मैप किया जाना चाहिए। उदाहरण के लिए, यदि किसी नियंत्रण में एक निर्भरता गुण होता है MyProperty1, तो हमें इसके भीतर निम्नलिखित मिल सकते हैं ControlTemplate:

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

ContentPresenter की सामग्री का मान प्राप्त होगा MyProperty1

कृपया ध्यान दें कि यदि संपत्ति का नाम है Content, तो निर्दिष्ट करने की कोई आवश्यकता नहीं है ContentSourceक्योंकि यह डिफ़ॉल्ट मान है।

उन लोगों के लिए जो एंगुलरज को जानते हैं: यह ट्रांसकॉल्यूड मेकैनिज्म के समान है।


2

इसका एक पुराना सवाल है, लेकिन मैं अभी एक एनिमेटेड टाइल कंट्रोल विकसित कर रहा था, एक सार्वभौमिक ऐप के लिए टेम्पलेट, पुराने फोन WP7 / 8 एसडीके से इस कोड को देखें:

<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>

यहाँ आप देख सकते हैं कंटेंटकंट्रोल कंटेंट प्रदर्शित करने के लिए कंटेनर और प्रस्तुतकर्ता है। ज्यादातर मामलों में ControlTemplate कंटेनर होगा, लेकिन यदि आप अपने ControlTemplateदूसरे कंटेनर में चाहते हैं तो आप एक अतिरिक्त कंटेनर रख सकते हैं: ContentControlइसमें और सामग्री को अलग से प्रस्तुत करने के लिए ContentPresenter। यदि आप एक अलग कंटेनर की जरूरत नहीं है तो बस का उपयोग करें ControlTemplateऔरControlPresentersMicrosoft के दोस्तों ने WP7 / 8 SDK को विकसित करने के लिए कम-से-कम सामग्री प्रदर्शित करने के लिए क्या किया। ContentControl का उपयोग सामग्री प्रदर्शित करने के लिए भी किया जा सकता है, लेकिन फिर यह कंटेनर और प्रस्तुतकर्ता दोनों के रूप में कार्य करता है। तो इसके उद्देश्य से ऊपर के नमूना कोड में कंटेनर और प्रस्तुतकर्ता में विभाजित किया गया है। गतिशील नमूनों में आप कंटेनर को प्रदर्शित कर सकते हैं (इसमें खाली पृष्ठभूमि हो सकती है या ऐसा कुछ नहीं हो सकता है) और फिर गतिशील रूप से इसे प्रस्तुतकर्ता सामग्री के साथ भरें। एक कंटेनर में आयाम (चौड़ाई, ऊंचाई आदि) हैं, आप उन गुणों को कंटेनर नियंत्रण पर रखते हैं और उस पर सामग्री प्रस्तुत करते हैं। नमूने में ContentControl निर्धारित करता है कि प्रस्तुतकर्ता सामग्री के साथ क्या किया जाना है।


1

कभी-कभी एक उदाहरण सैद्धांतिक शब्दजाल से आसान होता है। एक MS वेब साइट में (नीचे की ओर स्क्रॉल करें: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ), यह एक बटन का उपयोग करता है एक उदाहरण। एक बटन में एक ContentControl है, जो आपको एक नियंत्रण या एक कस्टम नियंत्रण रखने की अनुमति देता है जो एक छवि, पाठ, चेकबॉक्स, StackPanel, ग्रिड, जो कुछ भी हो सकता है।

बटन के अनुकूलन के बाद, अब Xaml पर, आप लिख सकते हैं

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

उपरोक्त उदाहरण कोड में, "my: Button.Content" ContentControl है। अन्यकंट्रोल आपके द्वारा निर्दिष्ट किया जाएगा कि कंटेंटप्रेशर कहां है।

इसी प्रकार, जब TextBox और TextBlock की तुलना करता है, तो TextBox के पास एक कंटेंटप्रेशर होता है, जिसमें आप ऊपर दिए गए बटन उदाहरण की तरह ही इसमें सामान भर सकते हैं जबकि एक टेक्स्टब्लॉक नहीं होता है। एक टेक्स्टब्लॉक केवल आपको पाठ दर्ज करने की अनुमति देता है।


2
एक Buttonनहीं करता है एक [ ContentControl] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), यह एक है (inherits से) ContentControlButton है एक ContentPresenter। ध्यान दें कि आप मानक के साथ ऐसा कर सकते हैं Button, इसे अनुकूलित करने की आवश्यकता नहीं है।
या

लेकिन इस संबंध में, यह उत्तर स्पष्ट नहीं करता है कि क्या और क्यों, इसके बजाय ContentPresenter, की सामग्री का प्रदर्शन करने ContentControlके ControlTemplateलिए उपयोग नहीं किया जा सकता है Button। जैसे, यह सवाल का जवाब नहीं देता है।
या मैपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.