闲话WPF之十三(WPF中的资源)

资源是保存在可执行文件中的一种不可执行数据。通过资源我们可以包含图像、字符串等等几乎是任意类型的数据。如此重要的功能,.NET Framework当然也是支持的,其中内建有资源创建、定位、打包和部署的工具。在.NET中可以创建.resx.resources文件。其中.resxXML项组成。.resx只是一种中间格式,不能被应用程序直接使用,它必须用工具转换为.resource格式。

WPF中,资源的含义和处理方式与传统的Win32Windows Forms资源有所区别。首先,不需要创建.resx文件,只需要在工程中指出资源即可,其它所有的工作都由WPF完成。其次,WPF中的资源不再像.NET中有资源ID,在XAML中引用资源需要使用Uri。最后,在WPF的资源中,几乎可以包含所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。在WPF本身的对象中,可以声明如下四种对象:StyleBrushesTemplatesDataSource

在定义具体的资源之前,我们先考虑如下几个相关的问题:

1、资源的有效范围:在WPF中,所有的框架级元素(FrameworkElement或者FrameworkContentElement)都有一个Resource属性。也就是说。我们可以在所有这类元素的Resource子元素中定义属性。在实践中,最常用的三种就是三种根元素所对应的资源:ApplicationPageWindow。顾名思义,在Application根元素下定义的资源将在当前整个应用程序中可见,都可以访问。在PageWindow中定义的元素只能在对应的PageWindow中才能访问。

2、资源加载形式:WPF提供了两种资源类型:Static资源和Dynamic资源。

两种的区别主要有两点:A)、Static资源在编译时决议,而Dynamic资源则是在运行时决议。B)、Static资源在第一次编译后即确定了相应的对象或者值。此后不能对其进行修改,即使修改成功也是没有任何意义的,因为其它使用资源的对象不会得到通知。Dynamic资源不同,它只有在运行过程中真正需要时,才会在资源目标中查找。所以我们可以动态的修改Dynamic资源。显而易见,Dynamic资源的运行效率将比Static资源低。

3、不管是Static资源还是Dynamic资源,所有的资源都需要设置Key属性:x:Key=”KeyName”。因为WPF中的资源没有资源ID,需要通过资源Key来标识以方便以后访问资源。范围资源时我们根据资源的类型使用StaticResource或者DynamicResource标记扩展。

好了,对WPF中的资源所有了解后,我们看一些简单的例子:

<Window

     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel>

     <StackPanel.Resources>

           <SolidColorBrush x:Key="MyBrush" Color="gold"/>

     </StackPanel.Resources>

     <TextBlock Foreground="{StaticResource MyBrush}" Text="Text"/>

</StackPanel>

</Window>

在这个例子中,我们在StackPanel元素的Resource子元素中定义了一个SolidColorBrush资源。然后在后面通过StaticResouce标记扩展,利用前面的x:Key属性访问定义好的资源。

资源除了可以在XAML声明外,还可以通过代码进行访问控制。支持Resource属性的对象都可以通过FindResource、以及Resource.AddResource.Remove进行控制:

<Window

     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Window.Resouce>

     <SolidColorBrush x:Key="MyBrush" Color="gold"/>

</Window.Resouce>

</Window>

我们先在代码XAMLWindow.Resource中定义了一个MyBrush。在代码中可以如下对其进行访问:

SolidColorBrush brush = this.FindResource("MyBrush") as SolidColorBrush;

如果需要进一步修改或者删除资源时,可如下编码:

this.Resouce.Remove(“MyBrush”);      //删除MyBrush资源

this.Resouce.Add(“MyBrush”);         //重新动态添加资源

说明:以上三处的this引用都是特指我们定义MyBrush的元素Window。读者朋友可根据实际情况修改。

posted @ 2006-12-27 22:42 Yiling Lai 阅读(3436) 评论(12)  编辑 收藏 网摘 所属分类: WPF

  回复  引用  查看    
#1楼 2006-12-28 00:04 | Sheva      
其实关于资源,介绍一下WPF里面资源的解析过程比较好,这是WPF比较有特点的地方。

Sheva
  回复  引用  查看    
#2楼 2006-12-28 09:20 | stswordman      
应该是资源的加载方式分为Static和Dynamic吧
资源本身不分Static和Dynamic?
不知道对不对
  回复  引用  查看    
#3楼 [楼主]2006-12-28 10:09 | Yiling Lai      
@stswordman

2、资源加载形式:WPF提供了两种资源类型:Staticz资源和Dynamic资源。

其实也就是按照加载形式的不同,资源可以分为两种类型。我们的理解都没有问题,只是表述不同。你认为呢?
  回复  引用  查看    
#4楼 2006-12-28 18:00 | stswordman      
呵呵
  回复  引用  查看    
#5楼 2006-12-30 16:03 | daxian110      
希望能有个例子说明一下Dynamic资源的使用.


  回复  引用  查看    
#6楼 [楼主]2006-12-30 16:56 | Yiling Lai      
@daxian110

好的,今天晚点时间我就写一个单独的Post
  回复  引用    
#7楼 2007-01-24 02:23 | jerry [未注册用户]
有哪位知道资源的层次呀`~~调用非祖先的资源要怎么调用???
  回复  引用  查看    
#8楼 [楼主]2007-01-25 17:16 | Yiling Lai      
@jerry

I will try it at this weekend! :-)
  回复  引用    
#9楼 2007-07-31 12:21 | Sophie [未注册用户]
我在這個網頁中補充如何在Expression Blend中建立資源的做法:
http://sophiecheng.spaces.live.com/blog/cns!A88551252299771F!274.entry
  回复  引用  查看    
#10楼 2007-12-18 21:43 | panlei      
我想在WPF 中动态加载资源XML,不知道怎么弄
  回复  引用  查看    
#11楼 2008-11-30 18:46 | namhyuk      
FrameworkElement, FrameworkContentElement, Application的属性应该是Resources,少了个s.





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-28 10:29 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: