《深入浅出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》笔记——资源篇的更多相关文章
- C# Note1:深入浅出WPF-MVVM篇
一.资源说明 (1)配套视频:深入浅出WPF 讲的不错! 待更!
- 深入浅出WPF笔记
数据层(Database,Oracle等) 业务逻辑层(Service,Data Access Layer,WCF) 表示层(WPF,Win Form,ASP.net,Silverlight) [WP ...
- 《深入浅出WPF》笔记——模板篇
原文:<深入浅出WPF>笔记--模板篇 我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法 ...
- 《深入浅出WPF》笔记——事件篇
如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...
- 《深入浅出WPF》笔记——绘画与动画
<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...
- 《深入浅出WPF》 学习笔记
<深入浅出WPF> 序言 1. 什么是WPF 2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...
- WPF笔记(1.8 资源与映射)——Hello,WPF!
原文:WPF笔记(1.8 资源与映射)--Hello,WPF! 终于,看明白了,已经是凌晨1:39分.这本书这一节写得实在是不好,一个local搞得我糊里糊涂,于是,准备按照他的思路,按照我的理解,改 ...
- 《深入浅出WPF》笔记四
1.WPF资源分布:数据库.资源文件.WPF对象资源.变量2.每个WPF的界面都具有一个名为Resources的属性,其类型为ResourceDictionary,以键值对的形式存储资源.3.检索资源 ...
- (转)WPF学习资源整理
由于笔者正在学习WPF,所以整理出网络中部分WPF的学习资源,希望对同样在学习WPF的朋友们有所帮助. 首推刘铁猛的<深入浅出WPF>系列博文 1.深入浅出WPF(1)——什么是WPFht ...
随机推荐
- 关于mybatis中,批量增删改查以及參数传递的问题
1.參数传递的问题 大多数情况下,我们都是利用map作为參数,而且大部分情况下都是仅仅有一个參数. 可是,我们也能够利用@param注解,来传入多个參数,此时,mybatis会自己主动将參数封装成ma ...
- NIO 入门(转)
NIO 入门 Greg Travis2003 年 11 月 17 日发布 分享此页面 WeiboGoogle+用电子邮件发送本页面 20 在开始之前 关于本教程 新的输入/输出 (NIO) 库是在 J ...
- 算法 Tricks(五)—— 将一个序列量化为何值时平方误差最小
设数列为 A[],区间在 [a, b],设使量化后误差平方最小的数值为 m,则误差平方关于 m 的函数可以写作如下形式: ∑i=ab(A[i]−m)2=(b−a+1)⋅m2−2m∑i=abA[i]+∑ ...
- eclipse插件安装验证及问题处理
eclipse插件安装验异常时可看当前workspace下面的.metadata/.log文件,找到具体的问题来处理.一般常用到插件安装不成功的原因如下: 1.jar包冲突: 2.jar包依赖的jav ...
- ZOJ 1494 Climbing Worm 数学水题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=494 题目大意: 一只蜗牛要从爬上n英寸高的地方,他速度为u每分钟,他爬完u需要 ...
- Spring中@Async用法详解及简单实例
Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类 ...
- js中json数据简单处理(JSON.parse()和js中嵌套html)
js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...
- 学习金字塔 分类: T_TALENT 2014-05-21 09:25 331人阅读 评论(0) 收藏
学习金字塔是美国缅因州的国家训练实验室研究成果,它用数字形式形象显示了:采用不同的学习方式,学习者在两周以后还能记住内容(平均学习保持率)的多少.它是一种现代学习方式的理论.最早它是由美国学者.著名的 ...
- <Linux> Xen虚拟机镜像的安装
了解系统安装在哪个磁盘上:fdisk -l 建立存放虚拟机镜像的目录:mkdir /mnt/vmx 更改文件系统格式: mkfs -t ext4 /dev/sda或者/dev/sdb(系统不在的那个硬 ...
- Cisco IOS images
Cisco IOS images for Dynamips - GNS3http://docs.gns3.com/1-kBrTplBltp9P3P-AigoMzlDO-ISyL1h3bYpOl5Q8m ...