前面几个小节介绍了如何引用自身项目的资源,而有时在应用程序开发过程中可能需要访问其他项目中的资源。例如,当几个人或十几个人一起设计一个解决方案时,每个人的工作都是不同的,编写的项目也是不同的,但是每个人都可能需要访问其他项目的某些资源,这就引入了类库资源的概念。对于每一个项目都能够引用的资源,我们称它为类库资源。下面通过一个示例具体讲解如何引用类库中的资源。
新建一个Windows应用商店的空白应用程序项目,并命名为GetClassLibraryResources。在解决方案资源管理器中,右键单击解决方案图标à添加à新建项目,选择“类库(Windows 应用商店应用项目)”模版,并命名为ResourcesLibrary,完成上述操作后就在一个解决方案中添加了两个项目,一个是空白的应用程序项目,另一个是类库项目。
为了能让GetClassLibraryResources项目引用ResourcesLibrary类库中的资源,需要在GetClassLibraryResources项目中添加对ResourcesLibrary类库项目的引用,操作方法是:右键单击GetClassLibraryResources项目中的“引用”文件夹à添加引用,打开“引用管理器”对话框,选择左侧菜单栏中的“解决方案”下面的“项目”菜单项后,在列表中选择ResourcesLibrary类库并确定,这时如果ResourcesLibrary类库中有GetClassLibraryResources项目需要的资源,那么GetClassLibraryResources项目就可以引用ResourcesLibrary类库中的资源。
接下来在GetClassLibraryResources项目和ResourcesLibrary类库中分别添加资源文件及资源。在GetClassLibraryResources项目中添加同18.2.3小节中项目的文件夹和资源文件,此资源文件可以不添加资源。
在ResourcesLibrary类库中添加一个“Strings”文件夹。在“Strings”文件夹下,新建“en-US”和“zh-CN”两个子文件夹并各添加一个名为“Resources.resw”的资源文件。在资源文件中分别添加如图18-15和图18-16所示的资源。
图18-15 ResourcesLibrary类库的Strings/en-US/Resources.resw资源文件中添加的资源
图18-16 ResourcesLibrary类库的Strings/zh-CN/Resources.resw资源文件中添加的资源
在ResourcesLibrary类库的Class1.cs文件中的ResourcesLibrary命名空间下添加一个名为“LocalizeResourcesLibrary”的类,用于获取类库中的字符串资源的值,代码如下所示:
using Windows.ApplicationModel.Resources;
public class LocalizeResourcesLibrary
{
ResourceLoader resourceLoader = null;
public string LibraryResources
{
get
{
String value;
GetLibraryResources("ClassLibraryResources", out value);
return value;
}
}
//通过引用参数传递类库资源文件中的资源值
private void GetLibraryResources(string resourceName, out string resourceValue)
{
if (resourceLoader == null)
{
//新建一个ResourceLoader类的对象resourceLoader
resourceLoader = new ResourceLoader("ResourcesLibrary/Resources");
}
resourceValue = resourceLoader.GetString(resourceName);
}
}
在LocalizeResourcesLibrary类中,定义一个ResourceLoader类的对象resourceLoader并赋值为空。然后定义LibraryResources属性用于输出字符串资源。在LibraryResources属性的get方法中调用GetLibraryResources方法用于获取字符串资源。
在GetLibraryResources方法中,先判断resourceLoader对象是否为空,当resourceLoader对象为空,以ResourcesLibrary类库中存储资源文件的路径“ResourcesLibrary/Resources”作为参数新建一个ResourceLoader类的对象resourceLoader,然后使用GetLibraryResource方法的参数resourceName作为调用resourceLoader对象GetString方法的参数,将获取的值赋给GetLibraryResource方法的引用参数resourceValue,用于返回获取到的资源值。如果resourceLoader对象不为空则无须新建一个ResourceLoader类的对象resourceLoader。
下面在GetClassLibraryResources项目中添加界面和后台代码实现引用ResourcesLibrary类库中的资源。首先在MainPage.xaml文件的Grid元素中添加如下代码。
<Button Content="获取类库资源" HorizontalAlignment="Left" Margin="682,196,0,0" Click="GetResources_Click" VerticalAlignment="Top"/>
<TextBlock Name="GetResourcesFromProject" HorizontalAlignment="Left" Margin="300,256,0,0" TextWrapping="Wrap" Text="引用方式获取类库中的资源:" FontSize="20" VerticalAlignment="Top" Height="38" Width="629"/>
<TextBlock Name="GetResourcesFromLibrary" HorizontalAlignment="Left" Margin="300,314,0,0" TextWrapping="Wrap" Text="直接获取类库中的资源:" FontSize="20" VerticalAlignment="Top" Height="38" Width="630"/>
<TextBlock HorizontalAlignment="Left" Margin="300,202,0,0" TextWrapping="Wrap" Text="单击按钮获取类库资源" FontSize="25" VerticalAlignment="Top" Height="25" Width="360"/>
在上面的代码中添加了一个显示内容为“获取类库资源”按钮和三个TextBlock文本块,三个文本块分别用于显示“引用方式获取类库中的资源:”、“直接获取类库中的资源:”和“点击按钮获取类库资源”文本信息。单击按钮将类库中资源的值显示在“引用方式获取类库中的资源:”和“直接获取类库中的资源:”两个文本块中。
界面效果如图18-17所示。
图18-17 GetClassLibraryResources项目的界面效果
然后在MainPage.xaml.cs文件中添加单击“获取类库资源”按钮的事件处理方法GetResources_Click,单击按钮使用引用和直接获取的方式把ResourcesLibrary类库中的资源值显示在相应的文本块中,代码如下所示:
using Windows.ApplicationModel.Resources;
using ResourcesLibrary;
private void GetResources_Click(object sender, RoutedEventArgs e)
{
//新建一个ResourceLoader类的对象resourceLoader
var resourceLoader = new ResourceLoader("ResourcesLibrary/Resources");
//新建一个LocalizeResourcesLibrary类的对象
var localizeResourcesLibrary = new LocalizeResourcesLibrary();
GetResourcesFromProject.Text = "引用方式获取类库中的资源:" + resourceLoader.GetString("ClassLibraryResources");
GetResourcesFromLibrary.Text = "直接获取类库中的资源:" + localizeResourcesLibrary.LibraryResources;
}
在GetResources_Click方法中,首先以ResourcesLibrary类库中资源文件的所在路径“ResourcesLibrary/Resources”作为参数新建一个ResourceLoader类的对象resourceLoader,接着又新建了一个LocalizeResourcesLibrary类的对象localizeResourcesLibrary。
然后以ResourcesLibrary类库中的字符串资源名“ClassLibraryResources”作为resourceLoader对象GetString方法的参数,并将获取到的字符串资源的值赋给GetResourcesFromProject文本块的Text属性。
接下来调用localizeResourcesLibrary对象的LibraryResources属性,直接获取类库中字符串资源的值赋给GetResourcesFromLibrary文本块的Text属性,这样就完成了引用类库中的字符串资源值到当前项目中显示的功能。
当设置语言首选项为中文(简体)时,运行程序,单击“获取类库资源”按钮,将以引用方式和直接方式获取类库中简体中文的资源值,效果如图18-18所示。
当设置语言首选项为英语时,运行程序,单击“获取类库资源”按钮,将以引用方式和直接方式获取类库中的英语资源并显示,效果如图18-19所示。
图18-18 语言首选项为中文(简体)时引用类库资源
图18-19 语言首选项为英语时引用类库资源
至此,在本节中所要讲述的资源引用相关知识就介绍完了。开发者可以根据需求在XAML元素中或在和后台代码中引用资源,也可以将资源分离到多个资源文件中或将资源存储到类库中,以便在不同场合使用。下一节将为读者讲述更改应用语言的相关知识点。