2011-09-05 13 views
10

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

शैली:

<Style x:Key="ImageCheckbox" TargetType="{x:Type CheckBox}"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/> 
     <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type CheckBox}"> 
        <Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"/>      
        <ControlTemplate.Triggers> 
         <Trigger Property="HasContent" Value="true"> 
          <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/> 
          <Setter Property="Padding" Value="4,0,0,0"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>  

मेरे सवाल यह है कि कि "स्रोत" संपत्ति इस कोड में पारित करने के लिए (XAML में) करने के लिए "ImageCheckBox" टेम्पलेट है:

<CheckBox Content="" Margin="0,2,0,0" Name="btTogglePalette" Grid.Row="1" Command="Helpers:UICommands.TogglePalette" 
           IsChecked="{Binding Path=PaletteStatus, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" 
           Style="{DynamicResource ImageCheckbox}"> 

ताकि छवि प्रदर्शित करेगा पारित पैरामीटर।

धन्यवाद

+0

तुम कैसे पैरामीटर पारित करेंगे है? –

+1

यह मेरा प्रश्न है :) मैं स्रोत पैरामीटर को पास करना चाहता हूं जैसे: Source = "image.ico" ImageCheckBox पर; तो चेकबॉक्स टेम्पलेट में छवि स्रोत संपत्ति का पर्दाफाश कैसे करें? – Arslan

उत्तर

7

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

ऐसा करने का उचित तरीका Checkbox से प्राप्त एक नया कस्टम नियंत्रण बनाना है और अपनी छवि (ImageSource टाइप करें) पर निर्भरता निर्भरता जोड़ें। इस तरह, आपके नियंत्रण टेम्पलेट से अंदर generic.xaml आप

<!-- in generic.xaml, inside the ControlTemplate for your ImageCheckbox style --> 
<Image Source="{TemplateBinding ImageSource}" /> 

कर सकते हैं और जहाँ आप अपने चेकबॉक्स का दृष्टांत आप

<local:ImageCheckbox ImageSource="Resources/MyImage.png" ...etc... /> 
+0

मैंने आपका रास्ता किया, धन्यवाद – Arslan

1

आप ImageCheckbox टेम्पलेट की इमेज स्रोत को परिभाषित या अपने खुद के चेक बॉक्स मानक चेकबॉक्स से पाने बनाने कस्टम चेकबॉक्स के प्रकार ImageSource की निर्भरता प्रॉपर्टी जोड़ते हैं, नव की संपत्ति स्रोत के लिए बाध्यकारी साथ कस्टम टेम्पलेट परिभाषित करने की जरूरत बनाया नियंत्रण

+0

धन्यवाद, यह इसाक के दृष्टिकोण जैसा ही है। – Arslan

+0

@ एआरएस, आपका स्वागत है! –

21

कर आप Tag संपत्ति का उपयोग कर सकते

<CheckBox Tag="YourImageSource" 
      Style="{DynamicResource ImageCheckbox}"/> 

और तो Template से Tag

012 में Image का स्रोत बाध्य करें
<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill" 
     Source="{Binding RelativeSource={RelativeSource TemplatedParent}, 
         Path=Tag}"/> 

हालांकि, मैं कई कारणों से एक संलग्न संपत्ति का उपयोग करना पसंद करूंगा।

  • Tag का उपयोग करने का इरादा वास्तव में स्पष्ट नहीं है
  • आपसे किसी और चीज़ के लिए Tag संपत्ति का उपयोग कर किया जा सकता है
  • आप एक से अधिक ImageSource उपयोग करने के लिए चाहते हो सकता है आदि

एक संलग्न संपत्ति का उपयोग बिल्कुल वही है, सिवाय इसके कि आपको संलग्न संपत्ति के चारों ओर कोष्ठक रखना होगा।

<CheckBox local:ImageSourceExtension.ImageSource="YourImageSource" 
      Style="{DynamicResource ImageCheckbox}"/> 

खाका

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill" 
     Source="{Binding RelativeSource={RelativeSource TemplatedParent}, 
         Path=(local:ImageSourceExtension.ImageSource)}"/> 

और यहाँ में संलग्न संपत्ति ImageSource

public class ImageSourceExtension 
{ 
    public static DependencyProperty ImageSourceProperty = 
     DependencyProperty.RegisterAttached("ImageSource", 
              typeof(ImageSource), 
              typeof(ImageSourceExtension), 
              new PropertyMetadata(null)); 
    public static ImageSource GetImageSource(DependencyObject target) 
    { 
     return (ImageSource)target.GetValue(ImageSourceProperty); 
    } 
    public static void SetImageSource(DependencyObject target, ImageSource value) 
    { 
     target.SetValue(ImageSourceProperty, value); 
    } 
} 
+2

अच्छा दृष्टिकोण। इसके लिए संलग्न गुणों का उपयोग करने के बारे में नहीं सोचा था। +1 –

+1

इसाक जैसे अच्छे दृष्टिकोण ने +1 – Arslan

+0

कहा या यदि आप इंटेलिजेंस समर्थन चाहते हैं, तो एक अतिरिक्त छविसोर्स निर्भरता संपत्ति के साथ नए चेकबॉक्स का वारिस करें। '{बाध्यकारी छवि स्रोत, सापेक्ष स्रोत = {सापेक्ष स्रोत पूर्वजों प्रकार = {x: स्थानीय टाइप करें: MyCheckBoxWithImageSource}}}' –

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