什么叫WPF的资源(Resource)? 资源是保存在可执行文件中的一种不可执行数据。在WPF的资源中,几乎可以包含图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。也就是说,应用程序中非程序代码的内容,比如点阵图、颜色、字型、动画/影片档以及字符串常量值,可将它们从程序中独立出来,单独包装成"资源(Resource)"。
使用资源的优势: 1. 由于不用写在程序代码中,方便管理:便于更新。 2. 优化资源,节省空间。资源一旦定义,便可重复利用。还记得FLASH中的将物体转换为元件吗?一旦将物体转换为元件,就可以重复利用了。在WPF中,似乎与之有共通之处。所不同的是,WPF将资源保存在XAML中,对我们而言是“可见的”。
一个简单的资源使用示例:
<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="MyBrush" Color="Gold"/> <Style TargetType="Border" x:Key="PageBackground"> <Setter Property="Background" Value="Blue"/> </Style> <Style TargetType="TextBlock" x:Key="Label"> <Setter Property="DockPanel.Dock" Value="Right"/> <Setter Property="FontSize" Value="8"/> <Setter Property="Foreground" Value="{StaticResource MyBrush}"/> <Setter Property="FontFamily" Value="Arial"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="Margin" Value="0,3,10,0"/> </Style> </Page.Resources> <StackPanel> <Border Style="{StaticResource PageBackground}"> <DockPanel> <TextBlock Style="{StaticResource Label}">Label</TextBlock> <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button> <Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" /> </DockPanel> </Border> </StackPanel> </Page>
上例中,我们使用了静态资源(Static Resource),如有需要,我们也可以使用动态资源(Dynamic Resources)。这两者的区别是:静态资源在第一次编译后即确定其对象或值,之后不能对其进行修改。动态资源则是在运行时决定,当运行过程中真正需要时,才到资源目标中查找其值。因此,我们可以动态地修改它。由于动态资源的运行时才能确定其值,因此效率比静态资源要低。需要说明的是,资源不仅可以在XAML代码中访问,也可以使用C#代码访问和控制它们。方法是使用FindResource查找资源,Resource.Add增加资源和Resource.Remove(移除资源)。
资源的范围(层级): WPF提供一个封装和存取资源(resource)的机制,我们可将资源建立在应用程序的不同范围上。WPF中,资源定义的位置决定了该资源的可用范围。资源可以定义在如下范围中: (1)物件级:此时,资源只能套用在这个Object物件,或套用至该物件的子物件。 (2)文件级:如果将资源定义在Window或Page层级的XAML档中,那么可以套用到这个文件中的所有物件。 (3)应用程序级:如果我们将资源定义在App.xaml 中,那么,就可以将资源套用到应用程序内的任何地方。 (4)字典级:当我们把资源封装成一个资源字典, 定义到一个ResourceDictionary的XAML文件时,就可以在另一个应用程序中重复使用。
资源层级 |
定义范围 |
使用范围 |
物件级 |
|
只能套用在这个Object物件或其子物件中 |
文件级 |
Window或Page层级的XAML档中 |
可套用到这个文件中的所有物件,如< Window.Resources > |
应用程序级 |
App.xaml文档中 |
套用到应用程序内的任何地方。 |
字典级 |
把资源封装成一个资源字典, 定义到ResourceDictionary的XAML文件中 |
可以在另一个应用程序中重复使用。 |
资源的查询方式 Static Resource的查询(1)查找使用该资源的元素的Resource字典; (2)顺着逻辑树向上查找父元素的资源字典,直到根节点; (3)查找Application资源; (4)不支持向前引用,即:不能引用在引用点之后才定义的资源。
Dynamic Resource的查询(1)查找使用该资源的元素的Resource字典; 如果元素定义了一个Style 属性,将查找Style中的资源字典;如果元素定义了一个Template属性,将查找FrameworkTemplate中的资源字典。 (2)顺逻辑树向上查找父元素的资源字典,直到根节点; (3)查找Application资源; (4)查找当前激活状态下的Theme资源字典;
(5)查找系统资源。