2010-07-08 141 views
0

我创建了一个按钮。我的基本要求是圆厚的边框,与一个以上的颜色(即,买入/卖出按钮)WPF模板继承

我希望我可以一次创建模板,并不仅仅是覆盖边框刷是这样的:

<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种颜色)。希望有一些方法来继承模板。

回答

2

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

要解决此问题,只需更改边框的BorderBrush以使用父按钮的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" /> 
+0

这是伟大的感谢。 是否可以将TemplateBinding应用于其他属性,例如GradientStop?例如,创建一个渐变按钮模板,但是操作哪两种颜色适用于它? – 2010-07-08 15:43:08