先看一段样式资源的代码
统一样式的定义方法: <Style TargetType="Button">,如果没有更优先的(样式的优先性)样式指定,那么默认所有在Grid中的Button都用这套样式
请注意不要加上x:Key属性
<Style TargetType="Button">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="Aquamarine" Offset="0.5"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Width" Value="80"/>
<Setter Property="Height" Value="38"/>
</Style>
</Grid.Resources>
特定的样式的定义方法: x:Key属性指定样式key ,定义时还可以基于已定义的某种样式,下面这代码可以很好都看出样式 及其作用范围
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
<Grid.Resources >
<Style TargetType="Button" x:Key="ButtonStyleBase">
<Setter Property="Width" Value=" 300"></Setter>
</Style>
<Style TargetType="Button" >
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="Aquamarine" Offset="0.5"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Width" Value="20"/>
<Setter Property="Height" Value="38"/>
</Style>
<Style TargetType="Button" x:Key="MyKey" BasedOn="{StaticResource {x:Type Button}}" >
<!--上面这一句基于 默认的Button 样式,请注意此时的默认Button样式一定要存在,否则编译通不, 这跟也是StaticResource /DynamicResource的区别 ,
这一句是基于指定的样式
<Style TargetType="Button" x:Key="MyKey" BasedOn="{StaticResource {x:Type Button}}" > -->
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<Button >MyButton</Button>
<Button Style="{StaticResource MyKey}" VerticalAlignment="Top" >
<!--指定边框样式,请注意这里的样式的有效范围 ->
<Button.BorderBrush >
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="Aquamarine" Offset="0.5"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Button.BorderBrush>
StyleSelf
</Button>
</Grid>
</UserControl>
控件模板的定义 : <Setter Property="Template">指定 模板
<!--上面这一句基于 默认的Button 样式,请注意此时的默认Button样式一定要存在,否则编译通不, 这跟也是StaticResource /DynamicResource的区别 ,
这一句是基于指定的样式
<Style TargetType="Button" x:Key="MyKey" BasedOn="{StaticResource {x:Type Button}}" > -->
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<!--这里通过Template属性重新定义了Button的模板,让Button为一个圆形-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Trigger的定义:<Control.Triggers > 或 <Style.Triggers> 来指定一个Trigger对象
<Setter.Value>
<ControlTemplate TargetType="Button" >
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<!--鼠标移到上面,当事件不发生时,回到原来的事件-->
<Setter Property="Foreground" Value="Yellow" />
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<!--键盘焦点,当事件不发生时,回到原来的事件-->
<Setter Property="Foreground" Value="White" />
</Trigger>
</ControlTemplate.Triggers>
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<!---->
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint=" 0.5,1">
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="Aquamarine" Offset="0.5"/>
<GradientStop Color="SkyBlue" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Width" Value="20"/>
<Setter Property="Height" Value="38"/>
</Style>
最后请教一下高手们,为什么这样定义会报错? 提示无效的属性,难道这样还要指定TargetType?但指定TargetType ,好像……请教高手…
<Button.Style >
<Style>
<Setter Property="FontSize" Value="12"/>
</Style>
</Button.Style>
</Button>