原文:《深入浅出WPF》笔记——资源篇

  前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源。我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉。在计算机程序中,只要是对程序有用的对象都可以统称资源。不过本文只记录WPF对象级资源和二进制资源。

一、WPF对象级资源的定义与查找

  在WPF中,每一个界面元素都是一个对象,并且都有一个名为Resources的属性,这个属性继承于FrameworkElement类,其类型为ResourceDictionary。由于元素的属性名是复数形式,所以每一个对象可以拥有多个资源,由于资源的多样化,获取到的资源的类型为object类型,所以在获取到资源时,必要时要进行转化成符合自己要求的类型;由其类型可以知对象资源是以键值对的形式来存储的,当需要某个资源时,可以通过key索引来获取。下面看一个小实例:

<Window x:Class="Chapter_08.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib"Title="MainWindow" Height="350" Width="525" ><Window.Resources><ResourceDictionary><sys:String x:Key="str">我是资源</sys:String></ResourceDictionary></Window.Resources><Grid x:Name="grid"><TextBlock x:Name="textblock" Text="{StaticResource ResourceKey=str}"/></Grid>
</Window>

在上面代码中资源为属性元素,所以<ResourceDictionary>是可以省略掉的,下面是在后台的等效代码:

            this.Resources["str1"] = "我是资源";this.textblock.Text = this.FindResource("str1") as string;

  由于比较简单,所以不贴效果图了。下面记录一下,检索资源的顺序,比如上面的例子,Textblock会先看一下自身有没有资源的Key为str的,如果没有发现的话,会继续沿着逻辑树往上找(也就是Window上找)。直到发现为止,如果在XAML中没有找到的话,程序还会在Application.Resources中找找看,如果再没有的话,那么就说我找不到(抛出异常)。提到“往外找”,如果有web经验的话,就想起js和css都可以在外面找,来控制页面的样式,WPF中完全也可以实现这样的功能。由于涉及到style,在此仅提一下使用方法:  

 <Window.Resources> <ResourceDictionary Source="***.xaml">   </Window.Resources>

这个很像html的外联式写法。

二、动态资源与静态资源

  我们实际生活中包含可再生资源和非可再生资源。在计算机里面的资源也是有分类的。主要分为静态资源(StaticResource)和动态资源(DynamicResource)。静态资源是在程序运行时,直接把资源读到内存里面,以后就再也不会发生改变;动态资源是可以改变的,具体可以根据情况使用。下面通过简单的实例来说明其区别:

XAML代码:

<Window x:Class="Chapter_08.ResourceType"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ResourceType" Height="150" Width="150" Background="Brown"><Window.Resources><sys:String x:Key="DynamicRes">动态资源</sys:String><sys:String x:Key="StaticRes">静态资源</sys:String></Window.Resources><StackPanel><TextBox x:Name="txt1" Text="{DynamicResource ResourceKey=DynamicRes}" Margin="10"/><TextBox x:Name="txt2" Text="{StaticResource ResourceKey=StaticRes}" Margin="10"/><Button x:Name="btn" Content="资源类型区分" Click="btn_Click_1" Height="25" Margin="5"/></StackPanel>
</Window>

点击事件代码:

        private void btn_Click_1(object sender, RoutedEventArgs e){this.Resources["StaticRes"] = "静态资源发生改变";this.Resources["DynamicRes"] = "动态资源发生改变";}

效果如图1:

图1

三、二进制资源

  和对象级资源一样,二进制资源也是对象,但是其所在的位置不是在窗体上,一般在项目下的文件夹或者属性文件件下面。除此之外,因为控件查找资源时,会沿着逻辑树查找,如果在树上找不到资源,最后还会在Application.Resources里面找,所以越是靠上面的资源,能利用资源的元素越多。(可以理解为站的越高,越容易被更多的元素看到,因为元素都是往上看的)。 很多时间都有程序用到外部的文件,为了防止操作不当,使文件与程序分离,破坏了程序的完整性,所以让文件编译到目标文件中(.exe、.dll文件)以二进制的数据存在,这就是要记录的二进制资源。如果要添加的资源是字符串而不是文件,那么可以使用应用程序Properties名称空间中的Resources.resx资源文件,如果是XAML要访问该资源的话,要把访问修饰符改为Public。如图2

如2

在后台代码调用资源:

  Properties.Resources.Password

在XAML中调用形式:

xmlns:prop="clr-namespace:Chapter_08.Properties"Text="{x:Static prop:Resources.Password}"

如果需要改为中文的话,可以直接去资源里面修改。该类资源便于国际化、本地化。除此之外还有一类就是文件型二进制资源。把文件编译成二进制文件,下面说一下具体的做法,在项目中添加一个文件夹Resources(可以是其他的名字)然后添加现有项,然后设置资源的属性的生成操作选项为:Resource,且复制到目录选项为:不复制, 如果不希望以资源的形式使用外部文件,那么生成操作选项为:None,复制到目录选择 :始终复制。

一种引用资源是在XAML中引用<Image x:Name="image" Source="Resources/Images/课程表.jpg" Stretch="Fill"/>

另一中引用时在cs后台代码中引用,其中有绝对路径和相对路径之分,下面列出两种形式:

            //Uri imgUri1 = new Uri(@"Resources/Images/课程表.jpg", UriKind.Relative);Uri imgUri1 = new Uri(@"pack://application:,,,/Resources/Images/课程表.jpg", UriKind.Absolute);this.image.Source = new BitmapImage(imgUri1);

其中相对路径直接写程序下面的文件夹到文件的路径,绝对路径格式为pack://application,,,:[/程序集名][/可选版本号][/文件夹名]/文件名称。

当然,随着资源被编译成二进制文件,所以生成的exe文件也变大了。

四、总结

  本文主要记录了对象资源和二进制资源以及动态资源和静态资源的区分,可以根据具体情况选择。本文是读书笔记,里面难免有理解不对的地方,欢迎讨论!下一篇:《深入浅出WPF》笔记——模板篇。

《深入浅出WPF》笔记——资源篇相关推荐

  1. (WPF)WPF要点之事件-深入浅出WPF笔记

    路由事件源于UIElement也就是可视化元素,需要利用其自有的CLR事件函数对路由事件的绑定进行封装,在可视化元素源元素的既有事件之上来增加其触发. 附加事件则始于路由事件概念,但是可将非可视化元素 ...

  2. 《深入浅出WPF》笔记——绑定篇(一)

    上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之.怎么恢复数据的核心地位,那就要先了解一下Binding. 一.Binding 基础 1.1WPF中Data Binding的带来 ...

  3. 《深入浅出WPF》笔记——模板篇

    原文:<深入浅出WPF>笔记--模板篇 我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法 ...

  4. 《深入浅出WPF》笔记——事件篇

    如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...

  5. WPF学习笔记(数据绑定篇3)

    接上回的<WPF学习笔记(数据绑定篇2)>,继续 BindValidation 此示例演示了: 如何使用错误模板: 使用样式显示错误信息: 如何在校验发生异常时执行回调: 首先,你可以看见 ...

  6. 深入浅出WPF学习笔记之Binding

    深入浅出WPF之Binding Binding Binding基础 Binding模型 把控件作为Binding源与Binding标记扩展 Binding的(Path)路径 Binding支持多级路径 ...

  7. 《深入浅出WPF》笔记四

    1.WPF资源分布:数据库.资源文件.WPF对象资源.变量 2.每个WPF的界面都具有一个名为Resources的属性,其类型为ResourceDictionary,以键值对的形式存储资源. 3.检索 ...

  8. C# 学习笔记入门篇(上)

    文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...

  9. 产品经理深入浅出学习笔记

    @TOC产品经理深入浅出学习笔记 发现市场需求 -> 商业需求文档(BRD)-> 组织团队头脑风暴(关键节点把控,梳理思路)-> 面对团队中出现的各种阻力与不同意见.能有效的化解与统 ...

  10. 深入浅出WPF(2)——解剖最简单的GUI程序

    深入浅出WPF(2)--解剖最简单的GUI程序 小序: 从这篇文章开始,我们进行XAML语言的上手学习.说实话,XAML这种语言一点也不难.如果把XML看成是"父类",那么XAML ...

最新文章

  1. 机器学习实战源码数据集
  2. 嵌入式linux webkit,嵌入式平台arm linux 之qt 4.5交叉编译到webkit时出错解决方法
  3. python套接字socket的作用_【学习笔记】python实现的套接字socket
  4. 基于WINCE6.0+S3C2443的camera驱动
  5. 针对eclipse调式代码时打断点出现斜杠的解决方法
  6. maven 打包普通java配置_配置pom.xml用maven打包java工程的方法(推荐)
  7. HDU5129 - Yong Zheng's Death
  8. Pda 数据库同步问题
  9. 用python在大麦网抢票攻略_大麦网抢票有什么攻略?
  10. HTML文件不小心删了怎么办,不小心删除的文件怎么恢复
  11. 福师计算机应用基础在线作业,福师《计算机应用基础》在线作业一
  12. JSD-2204-JDBC-SpringBoot-Day11
  13. 使用光纤熔接机熔接光纤
  14. js获取html中图片路径,用js快速的获取html页面中图片的地址
  15. [易飞]客供料处理方案
  16. 哈尔滨工业大学2019年计算机复试线,2019年哈尔滨工业大学考研复试分数线信息分析...
  17. 宽带拨号任何使用计算机,宽带拨号密码怎么查看【图解】
  18. linux安装stable diffusion2.0完整教程-还不会安装sd2.0?一篇文章教会你AI绘画
  19. 全志r16android sdk,全志R16_sdk_Dmaengine使用手册
  20. Unity5 全局光照

热门文章

  1. vs应用程序无法正常启动
  2. 火狐浏览器安装印象笔记剪藏
  3. 软件工程中的十三种文档
  4. 度盘高速下载器,比超级VIP还要快,推荐给大家
  5. 数据标注工具CVAT教程
  6. python数据分析入门到实战 知了课堂 百度云_零基础入门Python数据分析,只需要看懂这一张图,附下载链接!...
  7. python课堂笔记之django-day02(11)
  8. 实用的汉字拼音转换工具
  9. 搭建微信公众号后台开发环境
  10. c语言开发的烟花表白程序,C语言实战之浪漫烟花表白程序(2020年十二月整理).doc...