WPF模板继承

时间:2010-07-08 14:53:56

标签: wpf templates

我创建了一个按钮。我的基本要求是圆形较粗的边框,有多种颜色(即买/卖按钮)

我希望我可以创建一次模板,而不是像这样覆盖边框画笔:

<Style x:Key="BorderButton">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border BorderThickness="2" 
         BorderBrush="Red" 
         CornerRadius="3" 
         Background="{x:Null}">
           <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>
      </ControlTemplate>
     </Setter.Value>            
    </Setter>
  </Style>

  <Style x:Key="GreenBorderButton" BasedOn="{StaticResource BorderButton}" TargetType="{x:Type Button}">
    <Setter Property="BorderBrush" Value="Green" />
  </Style>

但它们都产生相同的风格。 我每次都需要写出整个模板吗?看似不必要的代码重复(特别是如果需要3-4种颜色)。希望有一些方法可以继承模板。

1 个答案:

答案 0 :(得分:2)

您的代码非常接近工作;问题是GreenBorderButton将BorderBrush应用于按钮本身,而不是被覆盖模板中的Border。

要解决此问题,只需更改Border的BorderBrush即可使用父Button的BorderBrush。您可以使用TemplateBinding执行此操作,如下所示:

<Style x:Key="BorderButton">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border"
                        BorderThickness="2" 
                        BorderBrush="{TemplateBinding Property=BorderBrush}"
                        CornerRadius="3" 
                        Background="{x:Null}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后,您可以使用与您相同的覆盖样式,也可以只执行以下操作:

<Button Style="{StaticResource BorderButton}" BorderBrush="Blue" Content="Blue" />