2011-09-05 62 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参数,如:Source =“image.ico”ImageCheckBox;所以如何在CheckBox模板中公开Image Source属性? – Arslan

回答

7

没有办法将自定义参数传递给样式或模板。您只能访问控件或绑定数据上的属性。也就是说,你可能会滥用复选框的Tag属性来实现这一点,但我不是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模板的图像来定义源或创建自己的复选框从标准的CheckBox派生,类型的ImageSource的依赖属性添加到自定义的复选框,以绑定到源的新属性来定义自定义模板创建控制。

+0

谢谢,这和Isak的方法一样。 – Arslan

+0

@Ars,不客气! –

21

可以使用Tag财产

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

而且然后将Template中的Image的来源绑定到Tag

<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

Isak说的好方法+1 – Arslan

+0

或者如果您想要智能感知支持,请使用额外的ImageSource依赖属性继承新的CheckBox。 '{Binding ImageSource,RelativeSource = {RelativeSource AncestorType = {x:Type local:MyCheckBoxWithImageSource}}}' –

相关问题