Resources和ResourceDictionary
Resources和ResourceDictionary简介
Resources这个属性是继承自FrameworkElement类的,所以在WPF界面上的元素有会有Resources这个属性。Resources的类型为ResourceDictionary,而ResourceDictionary能以键-值得形式存储资源,当需要用到某个资源时,可以使用键来访问资源对象。
定义Resources资源
ResourceDictionary可以存储任意类型的对象,例:在xaml代码中引用System命名空间中的string:
使用Resources资源
可以在任意元素中使用“内容=”{修饰词 键}””的形式来引用资源,例:在TextBlock引用String资源
1 | <Window x:Class="demo01DynamicResource.MainWindow" |
补充:
1、当某元素使用某资源时,它会从自身到上开始寻找资源,本例是从Text Block开始一直找到Window例的Resource后
TextBlock才停止寻找,如果没有找到资源程序会直接抛出异常。
2、如果Attribute和资源类型不匹配的话,也会抛出异常。
4、如果想在C#代码中使用定义在xaml代码中的资源,可以这么写:使用FindResource(“键”)自上向下地寻找资源
1 | string text = (string)this.FindResource("str"); |
StaticResource和DynamicResource
- WPF提供了两种资源的修饰词:StaticResource和DynamicResource。Static指的是程序的非执行状态而Dynamic指的是程序的运行状态。静态资源使用指的是在程序载入内存时对资源一次性使用,之后就不会去访问这个资源;而动态资源使用指的是在程序运行过程中仍然会去访问这个资源,当资源改变时,使用动态资源的内容也会跟着一起改变,例:在xaml代码中定义StaticResource和DynamicResource
1 | <StackPanel x:Name="sp"> |
- 在C#代码中改变资源,结果:tb1内容不变,tb2内容改变
1 | //TextBlock使用StaticResource,所以当资源改变时,Text属性也不会跟着一起改变。 |
在程序中添加二进制资源
WPF资源:资源词典里的资源、<xxx.Resources>标签中的资源
程序集资源(二进制资源):程序的内嵌资源
向程序中添加二进制资源的优点:能和程序自身打包在一起,不用担心资源会意外丢失(负作用就是应用程序体积会变大)
创建二进制资源:在解决方案的项目中找到Properties中的Resources.resx,可以在其中添加字符串、图片、图标、音频等的资源,然后在xaml代码或C#代码中调用,注意:为了能让xaml编译器访问到资源文件中的某个资源,必须把该资源的访问级别设置为Public。
- 在xaml代码中的调用创建的二进制资源:
引用命名空间:xmlns:prop=”clr-namespace:demo02rpmResource.Properties”
<Label Content="{x:Static prop:Resources.UserName}" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>
- 首先,要引用Properties的命名空间,然后使用Content=”{x:Static prop:Resources.UserName}”调用资源文件中的字符串,该资源为二进制资源,若使用文件夹添加资源,可以在属性窗口中修改生成操作为Resource,这样它就是二进制资源了。
参考书籍:深入浅出WPF