WPF只是定义了控件的作用,并没有定义控件的外观。我们可以使用控件模板来定义控件的外观。
Template是控件的一个属性,因此可以定义到样式中。
<Style x:Key="CalcButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Ellipse Fill="LightGreen" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Control.Margin" Value="10"/>
</Style>
这里定义的控件模板有其先天不足:没有显示按钮上的内容。需要添加ContentPresenter。
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="LightGreen"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
模板绑定
虽然样式很好的定义了一类控件,但是其定义的属性值都是在定义样式时固定死了的。如何能使控件指定自己独立的属性值呢?
我们需要使用模板绑定。
<Ellipse Fill="LightGreen" Stroke="{TemplateBinding Control.BorderBrush}"/>
这样就是把模板中的某一属性值绑定到了控件的某一属性上。
触发器
使用触发器,当触发条件满足时,触发器中的值和数据才会有效,如:
<Style x:Key="CalcButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse x:Name="theEllipse" Fill="LightGreen"
Stroke="{TemplateBinding Control.BorderBrush}"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsPressed" Value="True" >
<Setter TargetName="theEllipse"
Property="Fill" Value="Yellow"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>