前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源。咱们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉。在计算机程序中,只要是对程序有用的对象均可以统称资源。不过本文只记录WPF对象级资源和二进制资源。css
在WPF中,每个界面元素都是一个对象,而且都有一个名为Resources的属性,这个属性继承于FrameworkElement类,其类型为ResourceDictionary。因为元素的属性名是复数形式,因此每个对象能够拥有多个资源,因为资源的多样化,获取到的资源的类型为object类型,因此在获取到资源时,必要时要进行转化成符合本身要求的类型;由其类型能够知对象资源是以键值对的形式来存储的,当须要某个资源时,能够经过key索引来获取。下面看一个小实例:html
<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>是能够省略掉的,下面是在后台的等效代码:web
this.Resources["str1"] = "我是资源"; this.textblock.Text = this.FindResource("str1") as string;
因为比较简单,因此不贴效果图了。下面记录一下,检索资源的顺序,好比上面的例子,Textblock会先看一下自身有没有资源的Key为str的,若是没有发现的话,会继续沿着逻辑树往上找(也就是Window上找)。直到发现为止,若是在XAML中没有找到的话,程序还会在Application.Resources中找找看,若是再没有的话,那么就说我找不到(抛出异常)。提到“往外找”,若是有web经验的话,就想起js和css均可以在外面找,来控制页面的样式,WPF中彻底也能够实现这样的功能。因为涉及到style,在此仅提一下使用方法: app
<Window.Resources> <ResourceDictionary Source="***.xaml"> </Window.Resources>
这个很像html的外联式写法。this
咱们实际生活中包含可再生资源和非可再生资源。在计算机里面的资源也是有分类的。主要分为静态资源(StaticResource)和动态资源(DynamicResource)。静态资源是在程序运行时,直接把资源读到内存里面,之后就不再会发生改变;动态资源是能够改变的,具体能够根据状况使用。下面经过简单的实例来讲明其区别:spa
XAML代码:code
<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>
点击事件代码:xml
private void btn_Click_1(object sender, RoutedEventArgs e) { this.Resources["StaticRes"] = "静态资源发生改变"; this.Resources["DynamicRes"] = "动态资源发生改变"; }
效果如图1:htm
图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》笔记——模板篇。