简单来说如果只需对控件进行小幅度修饰(调整大小、位置、字体、颜色等)就用style,如果需要改变控件 的外观和行为就用controlTemplate(形状、事件触发如鼠标停留效果等)。在实际项目中,我们经常把模板(Template)定义在样式(Style)中,通过设置style。
比如:我要做一个用于地图缩放条的图片按钮,这时候通过style调整位置,用controltemplate设置按键形状。

<UserControl.Resources> 

<Style x:Key="ZoomUpButton" TargetType="Button"> 

<Setter Property="Width" Value="23.5" /> 

<Setter Property="Height" Value="25.5" /> 

<Setter Property="Template"> 

<Setter.Value> 

<ControlTemplate TargetType="Button"> 

<Grid Width="23.5" Height="25.5"> 

<Image Source="/Resource/zoom+.png" Stretch="Fill" /> 

<ContentPresenter HorizontalAlignment="Center" /> 

</Grid> 

<ControlTemplate.Triggers> 

<Trigger Property="IsMouseOver" Value="True"> 

<Setter Property="Effect"> 

<Setter.Value> 

<DropShadowEffect ShadowDepth="2" /> 

</Setter.Value> 

</Setter> 

</Trigger> 

</ControlTemplate.Triggers> 

</ControlTemplate> 

</Setter.Value> 

</Setter> 

</Style> 

</UserControl.Resources> 

<Button Style="{StaticResource ZoomUpButton}" />


再给个简单例子:一个带有 on/off 字样的单选框,选中的时候off字样隐去,没选中的时候on隐去

<Page.Resources> 

<ControlTemplate x:Key="switch"TargetType="{x:Type CheckBox}"> 

<Grid> 

<Grid.RowDefinitions> 

<RowDefinition Height="Auto" /> 

<RowDefinition Height="Auto" /> 

</Grid.RowDefinitions> 

<Border Width="96" Height="48" BorderBrush="Black" BorderThickness="1"> 

<Canvas Background="LightGray"> 

<TextBlock Canvas.Left="0" Canvas.Top="0" Foreground="Black" Text="Off" Margin="2" /> 

<TextBlock Canvas.Right="0" Canvas.Top="0 Foreground="Black" Text="On" 

Margin="2" /> 

<Line Name="lineOff" StrokeThickness="8" Stroke="Black" X1="48" Y1="40" 

X2="20" Y2="16" StrokeStartLineCap="Round" StrokeEndLineCap="Round" /> 

<Line Name="lineOn" StrokeThickness="8"Stroke="Black" X1="48" Y1="40" 

X2="76" Y2="16" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Visibility="Hidden" /> 

</Canvas> 

</Border> 

<ContentPresenter Grid.Row="1" 


Content="{TemplateBinding Content}" 


HorizontalAlignment="Center" /> 

</Grid> 

<ControlTemplate.Triggers> 

<Trigger Property="IsChecked" 

Value="True"> 

<Setter TargetName="lineOff" 

Property="Visibility" 

Value="Hidden" /> 

<Setter TargetName="lineOn" 

Property="Visibility" 

Value="Visible" /> 

</Trigger> 

</ControlTemplate.Triggers> 

</ControlTemplate> 

</Page.Resources> 


<CheckBox Template="{StaticResource switch}" 

Content="Master Switch" 

HorizontalAlignment="Center" 

VerticalAlignment="Center" />


你可以在controltemplate中定义复杂的界面,比如:在复杂的treeview中,在controltemplate中定义左边带图片的样式以及右键菜单中,然后再datatemplate中定义层次结构。

实在不好意思,虽然知道一图胜过千言,但截图实在不方便,这两个例子你可以自己运行一下,我也是才学wpf不久,但看了一些英文版的教程后,才慢慢上手,wpf-4-unleashed挺不错的

如果你要修改Control的结构的话,就用 controlTemplate,比如你想在Button里加一个Grid。在修改样式上,style 和 controlTemplate没有什么不同,都是对控件样式进行规范化,最终目的都是修改控件的Template。只不过用controlTemplate时,会在Resources里生成一个static 的ControlTemplate。但是如果是对数据进行规范化,就只能用数据模板了(DataTemplate),Style就不行了。