首页 > 代码库 > WPF资源

WPF资源

一 概要

本文通过实例演示WPF资源的使用,并在演示过程中对WPF资源相关知识点进行解释说明。

 

二 实例操作

1新建WPF应用程序WpfResourcesExp,程序结构如下图所示。

 

图1 WpfResourcesExp程序结构图

其中:

Resources.resx为“程序集资源”文件,保存嵌入到程序集本身中的各种资源文件,可以保存的文件类型有:字符串,图像,图标,文本文件等。编译时,资源文件被编译进目标文件,在目标文件里资源文件以二进制数据的形式存在,形成目标文件的资源段,使用时数据被提取出来。所以,我们也可以称“程序集资源”为“二进制资源”。(程序集资源)

MainWindow.xaml为程序的主画面,含有“WPF对象级资源”的定义,在后面会详细说明何为“WPF对象级资源”,并会演示“WPF对象级资源”的使用方法。WPF对象级资源)

images文件夹中包含实例中使用到的图片资源文件,使用该文件夹中的图片文件可以演示WPF中如何使用外部文件作为程序资源。(外部文件资源)

所以,本文将会对程序集资源、WPF对象级资源、外部文件资源在WPF中的使用进行探讨。


设计程序的主画面,最终效果如下图所示。

 

图2 WpfResourcesExp程序主画面

其中:

矩形框1中显示的内容来自于WPF对象集资源;

矩形框2中显示的内容来自于程序集资源;

矩形框3中显示的图片来自于外部文件资源。

 

Resources.resx文件添加资源文件

在项目管理器中展开Properties结点并双击Resources.resx文件打开资源文件编辑器,如下图所示。

 

图3 资源文件编辑器

在资源文件编辑器中,增加名称为Resource1Resource2Resource3Resource4字符串资源,并将资源文件的访问修饰符由“Internal”修改为“Public”,只有这样,资源文件中的内容才能被正常访问。

 

images文件夹中增加图片资源

在项目管理器中,选中images文件夹右击,在弹出菜单里选择“Add→Existing Item...”,在文件对话框中选择需要添加的文件miss.jpg,单击Add按钮,这样我们需要的图片就被加入到项目中来了。

 

5编写程序主画面代码,文件名为MainWindow.xaml

在前面几步准备好所需资源的基础上,来编写我们的程序主画面,详细代码如下所示。

<Window x:Class="WpfResourcesExp.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"
        xmlns:res="clr-namespace:WpfResourcesExp.Properties"
        Title="MainWindow" Height="350" Width="525" WindowStyle="ToolWindow">
    <Window.Resources>
        <ResourceDictionary>
            <sys:String x:Key="staticResource">
                相思
            </sys:String>
            <sys:String x:Key="dynamicResource">
                [作者]王维
            </sys:String>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.382*"></ColumnDefinition>
            <ColumnDefinition Width="0.618*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Text="{StaticResource ResourceKey=staticResource}" FontSize="28" Grid.Row="0" Grid.Column="0" Width="100" Height="50" HorizontalAlignment="Left" Margin="30,0,0,0"/>
        <StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal">
            <TextBlock Text="{DynamicResource ResourceKey=dynamicResource}" FontSize="20" Width="100" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
            <Button Content="修改"  Width="50" Click="Button_Click" />
        </StackPanel>
        <TextBlock Text="{x:Static res:Resources.Resource1}" FontSize="26" Grid.Row="2" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource2}" FontSize="26" Grid.Row="3" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource3}" FontSize="26" Grid.Row="4" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource4}" FontSize="26" Grid.Row="5" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <Image Source="images/miss.jpg" Stretch="Fill" Grid.Row="0" Grid.Column="1" Grid.RowSpan="6"/>
    </Grid>
</Window>

下面将使用这部分代码来说明WPF中资源的使用。

<Window.Resources>
        <ResourceDictionary>
            <sys:String x:Key="staticResource">
                相思
            </sys:String>
            <sys:String x:Key="dynamicResource">
                [作者]王维
            </sys:String>
        </ResourceDictionary>
    </Window.Resources>

每个WPF的界面元素都具有一个类型为ResourceDictionary的属性Resources,该属性继承自FrameworkElement,该属性使用“键-值”对的形式来管理程序资源,这里的资源就是前面提到的“WPF对象级资源”,因为这些资源属于WPF的对象。上面的代码,定义了KeystaticResource和dynamicResource的资源,他们属于WPFWindow对象。

 

<TextBlock Text="{StaticResource ResourceKey=staticResource}" FontSize="28" Grid.Row="0" Grid.Column="0" Width="100" Height="50" HorizontalAlignment="Left" Margin="30,0,0,0"/>
<TextBlock Text="{DynamicResource ResourceKey=dynamicResource}" FontSize="20" Width="100" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>

使用上面两行代码来使用前面定义的staticResource和dynamicResource资源。

使用WPF对象级资源时,控件会先在自己的Resources属性中检索资源,检索不到时会沿着逻辑树向上一级控件查找,直到找到为止,如果到最后也没有找到,就只好抛出异常。

上面使用资源的代码也可以简写为:

Text="{StaticResource ResourceKey=staticResource}"     ==》      Text="{StaticResource staticResource}"
Text="{DynamicResource ResourceKey=dynamicResource}"   ==》      Text="{DynamicResource dynamicResource}" 

代码中的StaticResource DynamicResource 表示我们使用的资源是静态资源和动态资源。

静态资源与动态资源的区别是:静态资源仅在程序载入内存时被使用一次,之后不会被改变;而动态资源在程序运行过程中仍然可以被改变。

下面的实验演示了静态资源与动态资源的区别。

在实例中的“修改”按钮的Click事件处理器中增加以下代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
     this.Resources["staticResource"] = "改改改";
     this.Resources["dynamicResource"] = "改改改";
}
运行程序后,点击“修改”按钮,资源staticResource的值不变,而资源dynamicResource的值被修改为"改改改"

通过这个例子便可以很好地理解静态资源与动态资源的区别及使用方法。

 

xmlns:res="clr-namespace:WpfResourcesExp.Properties"
<TextBlock Text="{x:Static res:Resources.Resource1}" FontSize="26" Grid.Row="2" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource2}" FontSize="26" Grid.Row="3" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource3}" FontSize="26" Grid.Row="4" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
        <TextBlock Text="{x:Static res:Resources.Resource4}" FontSize="26" Grid.Row="5" Grid.Column="0" Width="150" Height="50" HorizontalAlignment="Left" Margin="20,0,0,0"/>
这部分代码演示了程序集资源的使用。

Resources.resx文件的内容同样采用“键-值”对的形式来保存,编译后,Resources.resx会形成Properties名称空间中的Resources类,使用这个类的属性就可以访问资源了。所以在XAML中,需要先引入Properties名称空间,再使用其中的Resources类的属性Resource1、Resource2、Resource3、Resource4来访问我们定义的资源。

 

<Image Source="images/miss.jpg" Stretch="Fill" Grid.Row="0" Grid.Column="1" Grid.RowSpan="6"/>

这部分代码演示了外部文件资源的使用。

这里的外部文件资源是一幅图片,当然还可以是视频等其他资源。使用外部文件资源比较简单,直接给出文件的路径即可。

 

三 总结

本文通过实例演示了WPF对象级资源、程序集资源与外部文件资源的使用,并介绍了静态资源和动态资源的区别,希望通过本文,大家能对WPF资源的使用有一定的了解。

 

好了,就到这里了,明天又要上班了,烦啊。