2011-01-09 17 views
17

मेरे पास निम्न नियंत्रण टेम्पलेट है।नियंत्रण टेम्पलेट में टेम्पलेट बाइंडिंग

मैं टेम्पलेट बाइंडिंग का उपयोग कर टेम्पलेट नियंत्रण में छवि नियंत्रण के लिए स्रोत प्रॉपर्टी सेट करना चाहता हूं।

लेकिन चूंकि यह बटन नियंत्रण के लिए एक नियंत्रण टेम्पलेट है और बटन नियंत्रण स्रोत प्रॉपर्टी नहीं है, इसलिए मैं इस मामले में टेम्पलेट बाइंडिंग का उपयोग नहीं कर सकता।

<ControlTemplate x:Key="BtnTemplate" TargetType="Button"> 
     <Border CornerRadius="5" Margin="15" Cursor="Hand"> 
      <StackPanel> 
       <Image Name="Img" Style="{StaticResource ImageStyle}" Source="temp.jpg" Height="100" Width="100" Margin="5"></Image> 
       <Label Content="{TemplateBinding Content}" Background="Transparent" Margin="2"></Label> 
      </StackPanel> 
     </Border> 
    </ControlTemplate> 

के बाद से मैं बटन के विभिन्न उदाहरणों के लिए विभिन्न छवियों सेट करने के लिए, मैं के रूप में अच्छी पथ को हार्डकोड नहीं कर सकते।

कृपया मुझे बताएं कि इस स्थिति से कैसे निपटें।

उत्तर

28

मैं गतिशील संसाधनों का उपयोग कर सुझाव देंगे, उदा इस प्रकार टेम्पलेट को परिभाषित:

<ControlTemplate x:Key="buttonTemplate" TargetType="Button"> 
    <Border CornerRadius="5" Margin="15" Cursor="Hand"> 
     <StackPanel Orientation="Horizontal" Background="Yellow"> 
      <Image Source="{DynamicResource ResourceKey=Img}" Height="100" Width="100" Margin="5"></Image> 
      <Label Content="{TemplateBinding Content}" Background="Transparent" Margin="2"></Label> 
     </StackPanel> 
    </Border> 
</ControlTemplate> 

और इस तरह इसका इस्तेमाल:

<Button Content="Button" Template="{StaticResource ResourceKey=buttonTemplate}"> 
    <Button.Resources> 
     <ImageSource x:Key="Img">SomeUri.png/</ImageSource> 
    </Button.Resources> 
</Button> 
+1

क्या बटन को अधिक संक्षेप में उपयोग करना संभव है? <कस्टमबटन सामग्री = "बटन" आइकन = "SomeUri.png" /> की तरह? मुझे इस पर मारा गया है, क्या आप कृपया मेरी मदद कर सकते हैं? http://stackoverflow.com/q/13464735/640607 – Shankar

2

आपने वास्तव में यह नहीं कहा है कि आप अपने बटन के उपभोक्ताओं को स्रोत सेट करने की अपेक्षा कैसे करते हैं। आप Button.Tag प्रॉपर्टी का उपयोग कर सकते हैं, उदाहरण के लिए, और उसके बाद अपने टेम्पलेट में बाध्य करें।

public class ImageButton : Button 
{ 
    // add Source dependency property a la Image 
} 

तो टेम्पलेट और::

<ControlTemplate TargetType="ImageButton"> 
    <Border CornerRadius="5" Margin="15" Cursor="Hand"> 
     <StackPanel> 
      <Image Name="Img" Style="{StaticResource ImageStyle}" Source="{TempateBinding Source}" Height="100" Width="100" Margin="5"></Image> 
      <Label Content="{TemplateBinding Content}" Background="Transparent" Margin="2"></Label> 
     </StackPanel> 
    </Border> 
</ControlTemplate> 
+0

मैंने टैग संपत्ति का उपयोग किया लेकिन यह काम नहीं करता है। स्रोत = "{टेम्पलेट बाइंडिंग टैग}" और बटन बनाते समय, टैग = "Temp.jpg" लेकिन यह काम नहीं करता है। मैं केवल एक्सएएमएल कोड कोड में स्रोत सेट करना चाहता हूं। साथ ही, टैग एक अच्छा विचार नहीं हो सकता है क्योंकि controltemplate में कई नियंत्रण हो सकते हैं जिसके लिए मैं ऑब्जेक्ट के निर्माण के समय कुछ गुण सेट करना चाहता हूं। – Sam

+0

यह काम नहीं करता है क्योंकि 'स्रोत' प्रकार' छवि स्रोत 'है, और "Temp.jpg" एक' स्ट्रिंग' है। आपको छवियों के नियंत्रण में स्ट्रिंग्स को कनवर्ट करने के लिए कनवर्टर का उपयोग करना होगा, जैसा कि 'छवि' नियंत्रण करता है। –

5

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

निम्नलिखित कोड ठीक से काम कर सकते हैं:

<Window x:Class="GridScroll.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window2"> 
<Window.Resources> 
    <Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Border CornerRadius="5" Margin="15" Cursor="Hand" Background="Red"> 
         <StackPanel Orientation="Horizontal" Background="White"> 
          <Image Name="Img" Source="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}" Margin="5"></Image> 
          <Label Content="{TemplateBinding Content}" Margin="2"></Label> 
         </StackPanel> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 


</Window.Resources> 
<StackPanel Orientation="Horizontal"> 
    <Button Style="{StaticResource ButtonStyle}" Tag="a.jpeg" Content="a"/> 
    <Button Style="{StaticResource ButtonStyle}" Tag="b.png" Content="b"/> 
</StackPanel> 

+0

टैग करने के बजाए ऐसा करने का कोई अन्य तरीका है? मैं चिंतित हूं, बाद में मेरे नियंत्रण टेम्पलेट में कई नियंत्रण हो सकते हैं और मैं ऑब्जेक्ट बनाने के समय गुणों को सेट करना चाहता हूं। लेकिन चूंकि टैग पहले से ही उपयोग किया जा चुका है, इसलिए मैं फिर से इसका उपयोग नहीं कर पाऊंगा। – Sam

+0

आप केंट के सुझाव के रूप में कर सकते हैं। बटन से हटाएं और अपना नियंत्रण बनाएं। अपनी कस्टम निर्भरता संपत्ति जोड़ें और टैग का उपयोग करें क्योंकि मैं टैग – biju

+0

का उपयोग करता हूं मेरी समस्या मूल पोस्ट से थोड़ा अलग थी, लेकिन यह एकमात्र समाधान था जिसने चाल बनाई थी।मैंने इस पर सुबह सुबह बिताया, क्योंकि एक संसाधन संसाधन में त्रुटियां यूआई को हमारे आवेदन के दौरान कई एक्सएमएल डिजाइनरों में लोड होने से रोक रही थीं। गंभीरता से, धन्यवाद। – CodeOtaku

1

मुझे यकीन है कि मैं आपकी समस्या को बहुत अच्छी तरह से समझ नहीं कर रहा हूँ, लेकिन तुम क्यों ContentPresenter का उपयोग नहीं करते? यह आपकी छवि के लिए उच्च स्तर पर कोड को स्थानांतरित करने की अनुमति देता है।

<ControlTemplate x:Key="BtnTemplate" TargetType="Button"> 
    ... 
    <ContentPresenter/> 
</ControlTemplate> 
... 
<Button Template="{StaticResource BtnTemplate}"> 
    <Image .../> 
</Button> 
संबंधित मुद्दे