前言
本文是WPF基础系列第一篇,阅读本文需要了解XAML和标记扩展。
正文
XAML资源介绍
XAML资源包括brushes和styles等,每个框架集元素(FrameworkElement或FrameworkContentElement)都有一个Resources属性,它的类型是ResourceDictionary,其中包含已定义的资源。我们可以在Resources中定义多个资源,然后给子元素使用。例如:
<Page Name="root"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<SolidColorBrush x:Key="MyRed" Color="#FF0000"/>
</Page.Resources>
<StackPanel>
<Button Background="{StaticResource MyRed}" Content="这个按钮背景色是#FF0000"/>
</StackPanel>
</Page>
该示例在Page元素的Resources属性中定义了SolidColorBrush资源,然后给Button的Background属性使用。
Resources中的每个资源都必须有个唯一键,通过x:Key指令来指定,然后通过资源标记扩展(如StaticResource、DynamicResource)指定资源的键名来作用于某个控件上。
隐式键
尽管Resources中的每一项都必须有个唯一键,但并不是所有项都必须使用x:Key来指定,某些对象的键值(Style、DataTemplate等)可以与其他属性绑定,这种类型的键称为隐式键。
Style是资源定义中比较重要的一种方式,如下:
<Window.Resources>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Background" Value="Red" />
</Style.Setters>
</Style>
</Window.Resources>
<DockPanel>
<Button Content="这个按钮背景色是Red" />
</DockPanel>
Style可以不需要x:key属性,而是通过TargetType属性来指定隐式键,TargetType可以直接指定类型名称,或者通过{x:Type}标记扩展返回一个Type。如:TargetType="{x:Type Button}"
上述示例可以看做Style的隐式键为typeof(System.Windows.Controls.Button),通过WPF的机制,Button不必指定Style属性或者对该特点样式的引用,该Style也将作用于页面上的Button。从Button角度来看,Button使用的隐式键就是自己本身的类型,也就是System.Windows.Controls.Button。
而一旦显式指定了键,使用的时候就必须设置控件的Style属性。如:
<Window.Resources>
<Style x:Key="myButton" TargetType="Button">
<Style.Setters>
<Setter Property="Background" Value="Red" />
</Style.Setters>
</Style>
</Window.Resources>
<DockPanel>
<Button Content="这个按钮背景色没变"/>
<Button Content="这个按钮背景色是Red" Style="{StaticResource myButton}" />
</DockPanel>
与Style类似的还有DataTemplate,DataTemplate的隐式键是DataType的值而不是TargeType。
引用资源字典文件
我们在实际项目中可以把需要的资源定义在一个单独文件中,然后再引入到对应页面或者整个应用程序。如下:
1.添加资源字典文件
右键项目=》添加=》资源字典
这里我将文件命名为ResourceDictionaryDemo.xaml
2.定义资源
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LeoChat.Client">
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Background" Value="Red"/>
</Style.Setters>
</Style>
</ResourceDictionary>
3.引入资源字典文件并使用
<Window.Resources>
<ResourceDictionary Source="ResourceDictionaryDemo.xaml"/>
</Window.Resources>
<DockPanel>
<Button Content="这个按钮背景色是Red"/>
</DockPanel>
Source路径写正确就可以使用我们在ResourceDictionaryDemo.xaml中定义的各种资源了。
静态资源和动态资源
一个资源可以被静态或动态引用,分别通过{StaticResource}和{DynamicResource}标记扩展的方式引用。
静态资源在编译后便可在有效的资源字典中找到对应的资源,而动态资源则是在运行时才能确定它的值,因此动态资源可以在运行时更改。
资源查找行为
静态资源:
1.先查找使用该资源的元素的Resources字典。
2.再查找上级元素的Resources字典,直到根元素。
3.最后查找Application中的Resources字典。
动态资源:
1.查找使用该资源的元素的Resources字典。
2.查找上级元素的Resources字典,直到根元素。
3.查找Application中的Resources字典。
4.查找当前激活的Theme的Resources字典。
5.查找系统资源。
感谢阅读,敬请斧正。
版权声明:本文由不落阁原创出品,转载请注明出处!
广告位
暂无评论,大侠不妨来一发?
跟不落阁,学DOTNET!
广告位