2010-08-21 35 views
0

我正在使用ControlTemplate来定义WPF应用程序中按钮的外观。此外,我想使用样式来设置我的按钮的某些方面。这些样式应该在ControlTemplate定义,如(简化的)元件设置属性:如何使用样式更改模板化控件

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="White" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter TargetName="rect" Property="Fill" Value="Red"/> 
    </Style> 
</Window.Resources> 

现在,编译器抱怨说,的TargetName“矩形”是不是一个有效目标,我可以自一个untemplatized Button没有按”理解t包含名为“rect”的元素。

我知道我可以改变样式来设置完整的模板,但我想避免这种情况(因为模板比这里显示的要复杂得多,我不想为每种样式复制它... )

是否有可能实现此行为?也许通过设置TargetType对不对?任何其他想法?

回答

1

您可以不是只覆盖部分控件模板。你可以改变一切或不改变。

尽管你可以在样式上拥有属性的setter。

1

标准模式是在控件模板中使用TemplateBinding绑定到控件本身的属性,然后在该样式中设置控件的属性。例如:

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

这会将rect上的Fill属性绑定到Button上的Background属性。该样式将背景属性设置为红色,这将导致填充设置为红色。

为了设置默认值,你通常会创建一个模板设置,以及其他属性的样式:

<Window.Resources> 
    <Style x:Key="BaseStyle" TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Grid> 
         <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
         <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Background" Value="White"/> 
    </Style> 
    <Style x:Key="Style1" TargetType="Button" BasedOn="{StaticResource BaseStyle}"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

第一个样式将应用模板,并设置背景白色的,所以矩形将是白色的。第二种风格从第一种风格继承,但将背景设置为红色,因此矩形将变为红色。

相关问题