我有一个按钮样式。该样式包含Button的ControlTemplate。 ControlTemplate包含名为“ImgButton”的图像。
我想将此样式作为其他按钮的基本样式,并希望覆盖不同按钮的Image控件的“Source”属性。
有什么想法吗?
答案 0 :(得分:3)
您可以创建附加行为,该行为将提供指定Source的属性。您应该使用TemplatedParent作为RelativeSource将图像绑定到模板中的此属性。在派生样式中,您只需使用Setter指定不同的源。
附加行为:
public static class ImageSourceBehavior
{
public static readonly DependencyProperty SourceProperty = DependencyProperty.RegisterAttached(
"Source", typeof(ImageSource), typeof(ImageSourceBehavior),
new FrameworkPropertyMetadata(null));
public static ImageSource GetSource(DependencyObject dependencyObject)
{
return (ImageSource)dependencyObject.GetValue(SourceProperty);
}
public static void SetSource(DependencyObject dependencyObject, ImageSource value)
{
dependencyObject.SetValue(SourceProperty, value);
}
}
样式:
<Style x:Key="Style1"
TargetType="Button">
<Setter Property="local:ImageSourceBehavior.Source"
Value="..."/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Image Source="{Binding Path=(local:ImageSourceBehavior.Source),RelativeSource={RelativeSource TemplatedParent}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="Style2"
BasedOn="{StaticResource Style1}"
TargetType="Button">
<Setter Property="local:ImageSourceBehavior.Source"
Value="..."/>
</Style>