代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

WPF模板继承

  •  0
  • Sonic Soul  · 技术社区  · 15 年前

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

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

    <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 回复  |  直到 15 年前
        1
  •  2
  •   Jeremy    15 年前

    您的代码非常接近工作状态;问题是greenborderbutton正在将borderbrush应用于按钮本身,而不是覆盖模板中的边框。

    要解决此问题,只需更改border的borderBrush以使用父按钮的borderBrush。您可以使用这样的模板绑定来执行此操作:

    <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" />