在应用程序运行过程中,系统的语言、像素、对比度等系统设置可能会发生改变,应用程序应根据系统环境的改变及时做出适当的响应。为了解决这样的问题,可以在应用程序中为系统状态更改事件注册事件处理方法,当语言、像素等系统设置信息发生改变时将触发这个事件,并在事件处理方法中根据环境变化做出相应的调整。下面通过一个具体的示例来演示如何在应用程序中注册状态更改事件,并在所添加的事件处理方法中对语言首选项的更改做出响应。

新建一个Windows应用商店的空白应用程序项目,并命名为RuntimeChanges。在项目中添加如18.2.3小节示例中相同的语言文件夹、资源文件以及资源。

接下来在MainPage.xaml文件的Grid元素中添加一个“显示信息”按钮和两个TextBlock文本块,按钮用来获取资源的值并将其显示在其中一个TextBlock文本块中,另一个文本块则用来显示提示信息,代码如下所示:

<Button Name="ShowMessage" Content="显示信息" Margin="104,365,0,353" FontSize="20" Click="ShowMessage_Click" Height="50" Width="126"/>

<TextBlock HorizontalAlignment="Left" Margin="287,375,0,0" Name="GetResource" FontSize="25" TextWrapping="Wrap" VerticalAlignment="Top" Height="34" Width="161"/>

<TextBlock HorizontalAlignment="Left" Margin="104,334,0,0" TextWrapping="Wrap" Text="单击按钮显示信息" FontSize="20" VerticalAlignment="Top" Height="26" Width="362"/>

接下来在MainPage.xaml.cs文件中为“显示信息”按钮实现单击事件处理方法ShowMessage_Click,代码如下所示:

using Windows.ApplicationModel.Resources.Core;

   

private void ShowMessage_Click(object sender, RoutedEventArgs e)

{

    //将StringResource资源的值赋给GetResource文本块的Text属性

    GetResource.Text = ResourceManager.Current.MainResourceMap.GetValue("Resources/StringResource").ValueAsString;

//为状态更改事件注册处理方法

ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged;  

}

在ShowMessage_Click方法中,使用了ResourceManager类的Current成员中的MainResourcesMap成员所提供的GetValue方法,将资源路径Resources/StringResource作为此方法的参数,把返回的资源值通过ValueAsString属性转化成字符串赋值给GetResource文本块的Text属性,使资源值显示在GetResource文本块中。

ResourceManager类在资源的枚举和检查方面比ResourceLoader类拥有更高级的访问权限,ResourceManager类不仅支持访问应用的字符串资源,还能够枚举和检查各种文件资源,使用ResourceManager类需要引用Windows.ApplicationModel.Resources.Core命名空间。

接着在代码中为ResourceManager.Current.DefaultContext.QualifierValues.MapChanged状态更改事件注册事件处理方法QualifierValues_MapChanged,这样就可以在语言首选项更改时触发此事件,并根据更改信息做出响应。

下面来看一下QualifierValues_MapChanged事件处理方法的代码实现。

async private void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)

{

    //使用Dispatcher的RunAsync方法将更改后的语言配置资源值显示到界面中

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>

    {

        GetResource.Text = ResourceManager.Current.MainResourceMap.GetValue("Resources/StringResource").ValueAsString;

    });

}

在上面的方法中,为了避免占用UI线程造成混乱,使用了调度器Dispatcher的RunAsync方法将更改后的语言配置资源值显示到界面当中。

运行程序查看效果,当语言首选项为中文(简体)时,单击“显示信息”按钮,会显示中文信息的“你好世界”,效果如图18-20所示。此时若改变语言首选项为英语,显示的信息会立刻变为英语的“Hello World”,效果如图18-21所示。

图18-20 语言首选项为中文(简体)时效果

图18-21 语言首选项为英语时效果

使用本示例所提到的方法,可以在应用运行过程中,对语言首选项的变更作出响应,在前几个小节中,都是通过重启应用程序,对语言首选项的更改作出响应,这是本小节与之前所讲到的示例相比的一个明显差别。下一小节将介绍如何在应用程序中设置语言选项。

Windows Store App 全球化:运行时响应语言变更的更多相关文章

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

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

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

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

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

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

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

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

  5. Windows Store App 全球化:引用类库资源

    前面几个小节介绍了如何引用自身项目的资源,而有时在应用程序开发过程中可能需要访问其他项目中的资源.例如,当几个人或十几个人一起设计一个解决方案时,每个人的工作都是不同的,编写的项目也是不同的,但是每个 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 【转】Android APK反编译就这么简单 详解(附图)

    转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...

  2. ML-分类与逻辑回归

    布尔分类(binary classification)问题: 训练集:$S=\{(x^{(i)}, y^{(i)})\}$ 输入:特征向量$x$ 期望输出:$y\in\{0, 1\}$ 这里使用的假设 ...

  3. Apache开启状态查看页面(原创贴-转载请注明出处)

    =================写在前面的话================== 场景描述:有时候我们需要查看apache的运行状态,只需要开启apache的status功能就可以实现,但是stat ...

  4. spring mvc的拦截器

    package com.tech.jin.interceptor.method; import java.util.Arrays; import java.util.Map; import java. ...

  5. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/03 ...

  6. 客户端实现蓝牙接收(C#)

    知识总结发布  (转载) 网上有关蓝牙接收的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来,蓝牙开发需要用到一个第三方的库InTheHand.Net.Personal.dll,感兴 ...

  7. log4net一些配置说明

    <configuration> <configSections> <section name="log4net" type="System. ...

  8. 【BZOJ】3436: 小K的农场

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 938  Solved: 417[Submit][Status][Discuss ...

  9. 一个简单确非常实用的javascript函数

    在写js的时候,往往会碰到字符串拼接的问题,如果简单,直接使用+号连接字符串就可以了, 但是如果复杂,+用起来就非常不爽,在.net中有,Sting.Format函数,用起来还是很爽的,于是就想着js ...

  10. AnguarJS测试的实施步骤整理

    最近开发用到了AngularJS,据说目前大型系统都用这个作为前端.最近参与的一个项目,web部分重度使用了AngularJS,整个前端架构有组织有纪律.所谓的有纪律就是说,有比较完善的测试用例,用上 ...