【转载WPF资源】

什么叫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)查找系统资源。

posted @ 2015-05-08 20:47  沿途风景  阅读(170)  评论(0编辑  收藏  举报