WPF资源系统是一种保管一系列对象(如常用的画刷、样式或模版)的简单办法,从而使您更容易地复用这些对象。
WPF允许在代码中以及在标记中的各个位置定义资源(如特定的控件或窗口或在整个应用程序中定义)。
1、资源具有如下优点。
- 高效。定义好资源可以在多个地方复用。
- 可维护性。易于修改。
- 适应性。可以动态修改
2、资源集合。
每一个元素都有Resources属性,该属性存储了一个资源字典集合(是ResourceDictionary类的实例),资源集合可包含任意类型的对象,并且根据字符串编写索引。
3、资源分类
元素资源,窗口资源,应用程序资源
窗口资源(也称页面资源 页面上是可以定义资源的,而资源是标签里面的属性写法。) 把已经调用命名空间里面的东西放到资源里面;Window.Resources:就是页面级别的资源,而定义的资源只是页面级别的,其他页面都是不可以使用的,只是适用于当前的Window页面 。如:
<Window.Resources>
<SolidColorBrush x:Key="foreColor" Color="red"></SolidColorBrush>
</Window.Resources>
注意:①Key:相当于Id,具有唯一性,是当前函数的标志,资源下面代码通过 x:Key 值确定来绑定的是那个资源。
②当前Window页面不能有两个相同值的x:Key,否则,就会有冲突。(虽然不会爆错,但是,不知数据是哪来的。
元素级别的资源
1、写法:<WrapPanel.Resources>…</WrapPanel.Resources>:元素级别的资源
2、特点:(1)只有在存放当前资源的控件里面的其他应用资源的控件才能使用资源;如
<Button.Resources>
<SolidColorBrush x:Key="bgColor" Color="Yellow"></SolidColorBrush>
</Button.Resources>
4、资源使用
可以将资源引用为静态资源或动态资源。这可以通过使用StaticResource标记扩展或DynamicResource标记扩展来实现。通过替换已定义资源的值,StaticResource为属性提供了一个值,DynamicResource将属性值延迟为资源的运行时引用,从而为属性提供一个值 。
静态资源StaticResource:在程序载入时一次性使用,之后就不再访问这个资源
动态资源DynamicResource:在程序运行过程中才访问资源
5、资源层次
每个元素都有自己的资源集合,为了找到期望的资源,WPF在元素树中进行递归搜索,只要不在同一集合中多次使用相同的资源名,就可以重用资源名称,即元素资源-》窗口资源-》应用程序资源
现在来操作示例下,这个例子中按钮的背景色使用自己的元素资源,前景色使用窗口资源,字体使用应用程序级资源:
1、在control文件夹添加窗口文件ResWindow,在xaml文件不添加代码,完整代码是:
<Window x:Class="WpfApp6.control.EEWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp6.control"
mc:Ignorable="d"
Title="资源介绍与应用" Height="450" Width="800">
<!--窗口级资源-->
<Window.Resources>
<SolidColorBrush x:Key="foreColor" Color="red"></SolidColorBrush>
</Window.Resources>
<Grid>
<!--Background背景色使用内部资源bgColor,只能通过动态引用,Foreground前景色使用窗口资源,通过动态或静态都可以,FontFamily属性使用应用程序级资源,动态或静态引用都可以-->
<Button FontSize="30" Content="资源引用" HorizontalAlignment="Left" Margin="101,101,0,0" VerticalAlignment="Top" Width="127" Foreground="{DynamicResource foreColor}" FontFamily="{StaticResource ff}" Background="{DynamicResource bgColor}" Height="101" Click="Button_Click" >
<!--元素级资源,这个内部资源只能使用动态引用,不能静态引用-->
<Button.Resources>
<SolidColorBrush x:Key="bgColor" Color="Yellow"></SolidColorBrush>
</Button.Resources>
</Button>
</Grid>
</Window>
同时在app.xaml文件中修改启动文件,并设置资源,代码是:
<Application x:Class="WpfApp6.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp6"
StartupUri="control/ResWindow.xaml">
<!--应用程序级资源-->
<Application.Resources>
<FontFamily x:Key="ff" >楷体</FontFamily>
</Application.Resources>
</Application>
同时在button按钮中编写代码:
运行程序,看到效果:
点击按钮,字体颜色变为蓝色,这是因为在后台代码中修改了窗口资源的值,也进一步说明了动态资源是可以改变的。
接着看,资源字典
资源字典(ResourceDictionary) 如果想用代码创建一个完整的WPF应用程序,且可能还想用代码在该应用程序中创建任 何资源。为此,创建一个新的ResourceDictionary实例,然后使用对ResourceDictionary. add .的连续调用将所有资源添加到字典中。然后,使用由此创建的ResourceDictionary 在页面范围或Application.Resources中出现的元素上设置Resources属性。还可以将 ResourceDictionary作为独立对象维护,而不需要将其添加到元素中。
一句话:如果我们希望在多个项目中共享资源,那么我们可以通过资源字典的方式来实现。资源字典就是一个简单的xaml文档,这个文档就是专门用来存储共享资源的。
下面具体操作示例下:
在项目中创建一个文件夹res,在文件夹中添加两个资源文件,brushRes.xaml和fontRes.xaml,添加方式如图:
brushRes.xaml文件内容如下:
fontRes.xaml文件内容如下:
App.xaml文件内容如下:
完整代码如下:
<Window x:Class="WpfApp6.control.EEWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp6.control"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="资源介绍与应用" Height="450" Width="800">
<!--窗口级资源-->
<Window.Resources>
<SolidColorBrush x:Key="foreColor" Color="red"></SolidColorBrush>
</Window.Resources>
<Grid>
<!--Background背景色使用内部资源bgColor,只能通过动态引用,Foreground前景色使用窗口资源,通过动态或静态都可以,FontFamily属性使用应用程序级资源,动态或静态引用都可以-->
<Button FontSize="30" Content="资源引用" HorizontalAlignment="Left" Margin="101,101,0,0" VerticalAlignment="Top" Width="127" Foreground="{DynamicResource foreColor}" Background="{DynamicResource bgColor}" Height="101" Click="Button_Click" >
<!--元素级资源,这个内部资源只能使用动态引用,不能静态引用-->
<Button.Resources>
<SolidColorBrush x:Key="bgColor" Color="Yellow"></SolidColorBrush>
</Button.Resources>
</Button>
<!--此按钮应用资源字典文件中定义的资源项,其中fontColor位于brushRes.xaml,ffamily位于fontRes.xaml-->
<Button Foreground="{StaticResource fontColor}" FontFamily="{StaticResource ffamily}" Content="资源字典" FontSize="25" HorizontalAlignment="Left" Margin="414,108,0,0" VerticalAlignment="Top" Width="195" Height="101"/>
</Grid>
</Window>
运行后的效果是:
最后小结,资源的定义概括几点如下:
与传统WEB应用中CSS样式表类似
目的为了实现对象的重复使用
有助于XAML代码重用,有助于应用维护的一致性
定义资源的语法格式:
<根元素对象.Resources>
<资源定义>
</根元素对象.Resources>