0%

WPF之资源的定义和使用

Resources和ResourceDictionary

  1. Resources和ResourceDictionary简介

    Resources这个属性是继承自FrameworkElement类的,所以在WPF界面上的元素有会有Resources这个属性。Resources的类型为ResourceDictionary,而ResourceDictionary能以键-值得形式存储资源,当需要用到某个资源时,可以使用键来访问资源对象。

  2. 定义Resources资源

    ResourceDictionary可以存储任意类型的对象,例:在xaml代码中引用System命名空间中的string:

  3. 使用Resources资源

    可以在任意元素中使用“内容=”{修饰词 键}””的形式来引用资源,例:在TextBlock引用String资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Window x:Class="demo01DynamicResource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="120" Width="200">
<Window.Resources>
<sys:String x:Key="str1">同是天涯沦落人</sys:String>
<sys:String x:Key="str2">同是天涯沦落人</sys:String>
</Window.Resources>
<StackPanel>
<TextBlock x:Name="tb1" Text="{StaticResource str1}" Margin="5"/>
<TextBlock x:Name="tb2" Text="{DynamicResource str2}" Margin="5"/>
<Button x:Name="btn" Content="ChangeString" Margin="5" Click="Btn_Click"/>
</StackPanel>
</Window>

WPF

  • 补充:

    1、当某元素使用某资源时,它会从自身到上开始寻找资源,本例是从Text Block开始一直找到Window例的Resource后
    TextBlock才停止寻找,如果没有找到资源程序会直接抛出异常。
    2、如果Attribute和资源类型不匹配的话,也会抛出异常。
    4、如果想在C#代码中使用定义在xaml代码中的资源,可以这么写:使用FindResource(“键”)自上向下地寻找资源

1
2
string text = (string)this.FindResource("str");
this.tb1.Text = text;

StaticResource和DynamicResource

  • WPF提供了两种资源的修饰词:StaticResource和DynamicResource。Static指的是程序的非执行状态而Dynamic指的是程序的运行状态。静态资源使用指的是在程序载入内存时对资源一次性使用,之后就不会去访问这个资源;而动态资源使用指的是在程序运行过程中仍然会去访问这个资源,当资源改变时,使用动态资源的内容也会跟着一起改变,例:在xaml代码中定义StaticResource和DynamicResource
1
2
3
4
5
6
7
8
9
<StackPanel x:Name="sp">
<StackPanel.Resources>
<sys:String x:Key="str1">同是天涯沦落人</sys:String>
<sys:String x:Key="str2">同是天涯沦落人</sys:String>
</StackPanel.Resources>
<TextBlock x:Name="tb1" Text="{StaticResource str1}" Margin="5"/>
<TextBlock x:Name="tb2" Text="{DynamicResource str2}" Margin="5"/>
<Button x:Name="btn" Content="ChangeString" Margin="5" Click="Btn_Click"/>
</StackPanel>
  • 在C#代码中改变资源,结果:tb1内容不变,tb2内容改变
1
2
3
4
//TextBlock使用StaticResource,所以当资源改变时,Text属性也不会跟着一起改变。
sp.Resources["str1"] = "相逢何必曾相识";
//TextBlock使用DynamicResource,所以当资源改变时,Text属性也会跟着一起改变。
sp.Resources["str2"] = "相逢何必曾相识";

WPF

WPF

在程序中添加二进制资源

  1. WPF资源:资源词典里的资源、<xxx.Resources>标签中的资源

  2. 程序集资源(二进制资源):程序的内嵌资源

  3. 向程序中添加二进制资源的优点:能和程序自身打包在一起,不用担心资源会意外丢失(负作用就是应用程序体积会变大)

  4. 创建二进制资源:在解决方案的项目中找到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

WPF


参考书籍:深入浅出WPF

-------------本文结束感谢您的阅读-------------