WPF的样式机制以来于资源体系来定位样式。正如你在第5章看到的,样式在 元素的资源片段中定义,而且样式通过其名字被引用,正如示例6-18所示:
示例6-18
<Window x:Class="ResourcePlay.Window1" Text="ResourcePlay"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005">
<Window.Resources>
<Style x:Key="myStyle">
<Setter Property="Button.FontSize" Value="36" />
</Style>
</Window.Resources>
<Grid>
<Button Style="{StaticResource myStyle}">Hello</Button>
</Grid>
</Window>
然而,如何定义一个样式,使之自动的应用到一个元素,而无需显示指定要 引用的资源——这是可以实现的,而且非常有用——当你需要把一个样式应用到 具有独特类型的所有元素上,而不是把资源引用添加到每个元素上。示例6-19对 示例6-18做了一些修改,展示了隐式声明这一功能。
示例6-19
<Window x:Class="ResourcePlay.Window1" Text="ResourcePlay"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005">
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Button.FontSize" Value="36" />
</Style>
</Window.Resources>
<Grid>
<Button>Hello</Button>
</Grid>
</Window>
注意到Button标签不再有其特定的Style属性。然而,这个样式仍然通过 TargetType应用到Button上,而不是定义一个key,这个样式使用x:Type来设置 TargetType,于是通知XAML为这个TargetType类提供一个System.Type对象。
如果FrameworkElement没有显示指定Style,它总是会寻找一个使用其自身类 型的样式资源,作为其Target类型。
如果你建立了一些非样式的资源,例如SolidColorBrush,同时设置其x:Key 为某个UI元素的类型,如果试着使用该元素的类型就会发生一个错误。这是因为 你创建了一个带有TargetType的Style却没有指定x:Key,x:Key隐式地设置为同 TargetType一样。这个Key用于定位style。因此,通常而言,你应该避免将 x:Key设置为Type类型的对象。
因为元素会在资源中搜索它的样式,你可以利用系统级别的资源。你可以定 义一个样式资源在局部范围内,如果你仅仅希望影响少量的元素;或者在一个广 义范围上,例如Window.Resource;或者在应用程序的范围。而且样式可能延及 到系统级别。这种样式和资源之间的联系是使用皮肤和主体的关键