如何在WPF中以派生样式覆盖基本样式控件模板?

时间:2012-04-08 07:36:03

标签: wpf controltemplate

我有一个按钮样式。该样式包含Button的ControlTemplate。 ControlTemplate包含名为“ImgButton”的图像。

我想将此样式作为其他按钮的基本样式,并希望覆盖不同按钮的Image控件的“Source”属性。

有什么想法吗?

1 个答案:

答案 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>