2010-09-03 12 views
6

क्या डब्ल्यूपीएफ में कंट्रोल टेम्पलेट्स को टार्गेट टाइप की आवश्यकता है? मैं कुछ नियंत्रण restyling रहा हूँ, और देखा कि comboboxitem, listiviewitem और listboxitem सभी एक ही टेम्पलेट है:डब्ल्यूपीएफ कंट्रोल टेम्पलेट्स में टार्गेट टाइप होना चाहिए या नहीं?

<ControlTemplate x:Key="ListBoxItemCT" TargetType="{x:Type ListBoxItem}"> 

    <Border x:Name="Bd" 
     SnapsToDevicePixels="true" 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     Padding="{TemplateBinding Padding}" 
     CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
      /> 
    </Border> 

</ControlTemplate> 

क्या यह संभव है बस TargetType हटाने और तीनों के लिए एक टेम्पलेट के लिए? मैं ऐसा करने की कोशिश कर रहा हूं लेकिन अजीब त्रुटियों और समस्याओं को प्राप्त करता हूं। मुझे कोई विशिष्ट संदर्भ नहीं मिल रहा है कि ControlTemplates में एक प्रकार होना चाहिए।

उत्तर

12

लक्ष्य टाइप के लिए कोई आवश्यकता नहीं है, लेकिन यदि आप एक निर्दिष्ट नहीं करते हैं तो यह वही व्यवहार करेगा जैसे आप नियंत्रण का लक्ष्य टाइप निर्दिष्ट करते हैं। मुख्य लाभ जो किसी प्रकार को निर्दिष्ट करता है, वह आपको उस प्रकार की निर्भरता गुणों तक पहुंच प्रदान करता है जैसे कि टेम्पलेट बाइंडिंग्स और ट्रिगरों को मालिक के प्रकार के साथ संपत्ति अर्हता प्राप्त किए बिना। टार्गेट टाइप के बिना आप ContentControl.Content प्रॉपर्टी पर ContentPresenter की तरह निहित बाइंडिंग भी खो सकते हैं। एक बार जब आप एक लक्ष्य टाइप निर्दिष्ट करते हैं कि टेम्पलेट केवल उस प्रकार के नियंत्रण पर लागू हो सकता है या उस प्रकार से प्राप्त किया जा सकता है। विभिन्न प्रकारों के बीच साझा करने के लिए बस इस मामले में एक सामान्य बेस क्लास - ContentControl निर्दिष्ट करें।

सरल टेम्पलेट्स निम्नलिखित एक ही मूल परिणाम दे देंगे, लेकिन पहले बेहतर और अधिक आम है: प्रकार सामग्री सभी गुणों की मैन्युअल रूप से ऊपर तार करने की आवश्यकता के बिना

<ControlTemplate x:Key="CommonContentTemplate" TargetType="{x:Type ContentControl}"> 
    <Border x:Name="Bd" 
      SnapsToDevicePixels="true" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      Padding="{TemplateBinding Padding}" 
      CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
    </Border> 
</ControlTemplate> 

:

<ControlTemplate x:Key="CommonTemplate"> 
    <Border x:Name="Bd" 
      SnapsToDevicePixels="true" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      Padding="{TemplateBinding Padding}" 
      CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          Content="{TemplateBinding ContentControl.Content}" 
          ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
          ContentTemplateSelector="{TemplateBinding ContentControl.ContentTemplateSelector}" 
          ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"/> 
    </Border> 
</ControlTemplate> 
+0

धन्यवाद! मैंने पिछले दो हफ्तों में इस बड़े निर्भरता संपत्ति आरेख को बिताया, जिससे यह समझ में आता है। मुझे लगता है कि मैं कोशिश कर सकता था कि ... :) – dex3703

+0

और यह मुझे मिली अजीब त्रुटियों (नियंत्रण से प्राप्त चीजों को नहीं ढूंढने) की व्याख्या करेगा और सामग्री क्यों दिखाई नहीं देगी। – dex3703

2

वे सभी System.Windows.Controls.ContentControl से निकले हैं, इसलिए आप इसे इसके बजाय लक्षित कर सकते हैं।

+0

धन्यवाद! ऊपर के रूप में एक ही जवाब लेकिन अधिक संक्षेप में। :) – dex3703

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