模板
模板允许你用空想出来的任何东西完全替换一个元素的可视树,但其他功能不受影响。
WPF中模板类型:
DataTemplate模板
ItemsPanelTemplate模板
ControlTemplate模板(此处介绍)
<StackPanel>
<StackPanel.Resources>
<!-- 自定义模板,指定模板使用类型:按钮 -->
<ControlTemplate x:Key="buttonTemplate" TargetType="Button">
<Grid>
<!-- 画圆,名称:outerCircle -->
<Ellipse x:Name="outerCircle">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<!-- 动态指定背景色 -->
<GradientStop Offset="0"
Color="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Background.Color}"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse RenderTransformOrigin=".5,.5">
<Ellipse.RenderTransform>
<ScaleTransform ScaleX=".8" ScaleY=".8"/>
</Ellipse.RenderTransform>
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<!-- 动态绑定到按钮的Content值(Content值可为文本,图片对象) -->
<Viewbox>
<!-- 使用ContentPresenter更轻量 -->
<ContentPresenter Margin="{TemplateBinding Button.Padding}"
Content="{TemplateBinding Button.Content}"/>
</Viewbox>
</Grid>
<!-- 定义触发器,设置当鼠标移上时按钮显示样式 -->
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<!-- 通过绑定按钮BorderBrush属性,指定按钮背景笔刷 -->
<Setter TargetName="outerCircle" Property="Fill"
Value="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=BorderBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</StackPanel.Resources>
<!-- 使用模板 -->
<Button Template="{StaticResource buttonTemplate}" Height="100" Width="100"
Padding="20" Background="GreenYellow" FontSize="100" BorderBrush="Pink">Ok</Button>
<Button Template="{StaticResource buttonTemplate}" Height="150" Width="150"
Padding="10" Background="LightPink" BorderBrush="Orange">
<Image Source="img/sign.gif"></Image>
</Button>
</StackPanel>
将模板与样式混合起来
优点:
1.可将模板和任意属性设置组合
2.带来默认模板的效果
3.允许提供默认但可重载的属性值
<StackPanel.Resources>
<!-- 模板与样式混合使用 -->
<Style x:Key="ButtonStyle" TargetType="Button">
<!-- 指定默认背景色笔刷 -->
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="Beige"/>
<GradientStop Offset="1" Color="DarkBlue"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<!-- 定义模板 -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<!-- 动态绑定背景色笔刷 -->
<StackPanel Background="{TemplateBinding Background}"
Width="100" Height="50" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>
<!-- 使用默认渐变笔刷填充 -->
<Button Style="{StaticResource ButtonStyle}" />
<!-- 指定自定义背景色 -->
<Button Style="{StaticResource ButtonStyle}" Background="Bisque" /></pre>