前面几个小节介绍了如何引用自身项目的资源,而有时在应用程序开发过程中可能需要访问其他项目中的资源。例如,当几个人或十几个人一起设计一个解决方案时,每个人的工作都是不同的,编写的项目也是不同的,但是每个人都可能需要访问其他项目的某些资源,这就引入了类库资源的概念。对于每一个项目都能够引用的资源,我们称它为类库资源。下面通过一个示例具体讲解如何引用类库中的资源。

新建一个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元素中或在和后台代码中引用资源,也可以将资源分离到多个资源文件中或将资源存储到类库中,以便在不同场合使用。下一节将为读者讲述更改应用语言的相关知识点。

Windows Store App 全球化:引用类库资源的更多相关文章

  1. Windows Store App 全球化:引用分离资源文件中的资源

    大部分应用程序仅需要单个默认资源文件,例如Strings/zh-CN/Resources.resw,但是在某些应用程序中,最好将资源分离到多个资源文件中,以便更好地组织资源内容,这样就需要考虑如何引用 ...

  2. Windows Store App 全球化:在后台代码中引用字符串资源

    上文提到了引用字符串资源具有两种方式,分别是在XAML元素中和在后台代码中引用资源文件中的字符串资源.在第一小节已经介绍了如何在XAML元素中引用字符串资源,本小节将讲解在后台代码中引用字符串资源的相 ...

  3. Windows Store App 全球化 资源匹配规则

    上面几个小节通过示例介绍了如何引用资源以及设置应用语言来显示不同语言的信息,这些示例都只是添加了简体中文和英语两种语言来显示资源,而在一些复杂的应用程序中,字符串资源可能会被定义成多种语言,文件资源也 ...

  4. Windows Store App 全球化:在XAML元素中引用文件资源

    上一小节讲解了如何在XAML元素中使用x:Uid属性引用资源文件中的字符串资源,通过改变语言首选项显示不同的运行结果.如果把字符串资源变成文件资源,就不能使用x:Uid属性来引用这些文件资源.本小节将 ...

  5. Windows Store App 全球化:在XAML元素中引用字符串资源

    在应用程序中可以通过XAML元素和后台代码两种方式引用资源文件中的字符串资源.本小节先讲述如何在XAML元素中引用字符串资源的相关知识点. 在XAML元素中可以通过使用x:Uid属性来引用资源文件中的 ...

  6. Windows Store App 全球化:运行时响应语言变更

    在应用程序运行过程中,系统的语言.像素.对比度等系统设置可能会发生改变,应用程序应根据系统环境的改变及时做出适当的响应.为了解决这样的问题,可以在应用程序中为系统状态更改事件注册事件处理方法,当语言. ...

  7. Windows Store App 全球化 设置指定页面的语言

    上一小节介绍了通过在应用程序中添加语言设置选项来改变整个应用显示信息的语言,而有时用户只想对应用中某一页面信息的语言进行调整,这时就不能使用上一小节所讲述的知识来对应用进行设置.下面将通过一个示例介绍 ...

  8. Windows Store App 全球化:应用中设置语言选项

    当开发者将开发的应用上传到Windows应用商店以后,使用Windows 8系统的用户可能会看到并下载这些应用,而这些用户所在的区域或者所使用的语言可能都不相同,如果他们在使用应用程序时希望改变应用显 ...

  9. Windows store app[Part 3]:认识WinRT的异步机制

    WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...

随机推荐

  1. esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较

    esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较 JavaWeb开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户 ...

  2. 华硕电脑u盘启动及原来win8现在安装win7后找不到硬盘解决方法

    1.设置U盘启动 开机按F2进入BIOS,Security-Secure Boot Control设为Disabled , BOOT-Lunch CSM 设为Enabled 按F10保存. 重启按ES ...

  3. [DataBase] MongoDB (7) MongoDB 索引

    MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...

  4. [ASM C/C++] C语言函数的可选性自变量

        函数的可选性自变量  C语言允许定义自变量数量可变的函数,称为variadic函数.variadic函数需要固定数目的强制性自变量,后面是数量可变的可选性自变量. 也就是说必须至少有一个强制性 ...

  5. Apache2.4权限配置(原创帖-转载请注明出处)

    ==================说在前面的话================= 1:这次实验使用的php项目是Discuz,Discuz的安装请参照:http://www.cnblogs.com/ ...

  6. Bootstrap_Javascript

    弹窗 一. 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-cont ...

  7. LRU页面置换算法

    本文以序列长度20的{ 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};以及页面4:为例: #include <stdio.h> #define Init ...

  8. UVALive 3902 网络

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. 链表栈的C语言实现

    #ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...

  10. python与C++交互

    python和C++能进行有效的交互,c++调用Python的一些小用法 写了一个python脚本导入发生异常,可能是编码问题(如存在中文),Python默认的是ASCII可加上:#!/usr/bin ...