जवाबों:
ContentControlनियंत्रण के लिए एक आधार वर्ग है जिसमें अन्य तत्व होते हैं और एक Content-property होता है (उदाहरण के लिए, Button)।
ContentPresenter सामग्री को प्रदर्शित करने के लिए नियंत्रण टेम्पलेट्स के अंदर उपयोग किया जाता है।
ContentControl, जब सीधे इस्तेमाल किया जाता है (यह एक बेस क्लास के रूप में इस्तेमाल किया जाना चाहिए), एक नियंत्रण टेम्पलेट है जो सामग्री को प्रदर्शित करने के लिए ContentPresenter का उपयोग करता है।
अंगूठे के मेरे नियम (हर मामले में लागू नहीं, अपने फैसले का उपयोग करें):
ControlTemplateउपयोगContentPresenterControlTemplate(सहित DataTemplateऔर बाहर टेम्पलेट्स) उनमें से किसी का उपयोग न करने की कोशिश करें, यदि आपको आवश्यकता है, तो आपको पसंद करना चाहिएContentPresenterContentControlआप एक कस्टम "lookless" नियंत्रण कि मेजबान सामग्री बना रहे हैं और आप एक मौजूदा नियंत्रण के टेम्पलेट बदलकर एक ही परिणाम प्राप्त नहीं कर सकता है, तो (जो अत्यंत दुर्लभ होना चाहिए)।ContentPresenter का उपयोग आमतौर पर ControlTemplate में किया जाता है, कहने के लिए एक प्लेसहोल्डर के रूप में "यहां वास्तविक सामग्री डालें"।
एक ContentControl कहीं भी इस्तेमाल किया जा सकता है, जरूरी नहीं कि एक टेम्पलेट में। यह किसी भी DataTemplate को सौंपे गए सामग्री के प्रकार के लिए परिभाषित करेगा
मैंने हाल ही में अपने ब्लॉग पर इन दोनों नियंत्रणों के बारे में एक पोस्ट लिखी है:
ContentPresenter बनाम ContentControl (EDIT: टूटा हुआ लिंक संग्रहीत संस्करण के साथ बदल दिया गया है।)
ContentPresenter.ContentSource क्या वास्तव में दो वर्गों के बीच सबसे बड़ा अंतर बना देता है। ContentSource संपत्ति केवल एक ControlTemplate के भीतर समझ में आता है; यह निर्धारित करता है कि किस अस्थायी संपत्ति को सामग्री के साथ मैप किया जाना चाहिए। उदाहरण के लिए, यदि किसी नियंत्रण में एक निर्भरता गुण होता है MyProperty1, तो हमें इसके भीतर निम्नलिखित मिल सकते हैं ControlTemplate:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter की सामग्री का मान प्राप्त होगा MyProperty1।
कृपया ध्यान दें कि यदि संपत्ति का नाम है Content, तो निर्दिष्ट करने की कोई आवश्यकता नहीं है ContentSourceक्योंकि यह डिफ़ॉल्ट मान है।
उन लोगों के लिए जो एंगुलरज को जानते हैं: यह ट्रांसकॉल्यूड मेकैनिज्म के समान है।
इसका एक पुराना सवाल है, लेकिन मैं अभी एक एनिमेटेड टाइल कंट्रोल विकसित कर रहा था, एक सार्वभौमिक ऐप के लिए टेम्पलेट, पुराने फोन 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 निर्धारित करता है कि प्रस्तुतकर्ता सामग्री के साथ क्या किया जाना है।
कभी-कभी एक उदाहरण सैद्धांतिक शब्दजाल से आसान होता है। एक 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 के पास एक कंटेंटप्रेशर होता है, जिसमें आप ऊपर दिए गए बटन उदाहरण की तरह ही इसमें सामान भर सकते हैं जबकि एक टेक्स्टब्लॉक नहीं होता है। एक टेक्स्टब्लॉक केवल आपको पाठ दर्ज करने की अनुमति देता है।
Buttonनहीं करता है एक [ ContentControl] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), यह एक है (inherits से) ContentControl। Button है एक ContentPresenter। ध्यान दें कि आप मानक के साथ ऐसा कर सकते हैं Button, इसे अनुकूलित करने की आवश्यकता नहीं है।
ContentPresenter, की सामग्री का प्रदर्शन करने ContentControlके ControlTemplateलिए उपयोग नहीं किया जा सकता है Button। जैसे, यह सवाल का जवाब नहीं देता है।