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

新建一个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. Thinkphp学习回顾(二)之config.php的配置

    常见配置项 <? return array( //'配置项'=>'配置值' 'TMPL_L_DELIM'=>'<{', //修改左定界符,防止其与js中的代码重合,发生造成问题 ...

  2. wf(七)(手把手包会)

    这个demo中我们将用If/Else逻辑加到工作流用来展示不同的message通过自定义的条件. 如果name的字符数是奇数,第一个单词就输出“Greeting”否则输出“Hello”. 1. 在Sa ...

  3. js中arguments的用法

    了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...

  4. AndroidManifest.xml详解(上)

    本文编辑整理自:http://blog.163.com/hero_213/blog/static/39891214201242835410742/ 一.关于AndroidManifest.xml    ...

  5. webstorm 配置scss的问题

    第一种方法(ruby方法) 先安装ruby,在windows/system32目录下 1.先查询源是什么 gem sources 2.移除原有的源头 gem sources -r http://xxx ...

  6. Photoshop学习笔记(待续)

    1. 界面设置 新建 设置 自动选择快捷键:单击时按住cmd 标尺和智能参考线 右侧的四大面板 单位与标尺 保存工作区 其他 每一种颜色模式对应一种媒介 HSB(色相.饱和度.亮度) => 人眼 ...

  7. WPF 中 InitializeComponent 不存在解决方案

    部门给了一个WPF应用,但是之前没学过,所以再用vs2015创建测试程序的时候,竟然报了错,一创建项目就报错的程序还真不多.大概就是 InitializeComponent不存在吧.所以在网上看了很多 ...

  8. nRF52832开发日志--SAADC调试

    今天各种事情比较多.......技术活时间略少,就搞了这一项~ 52832的ADC和之前51822系列还是有蛮大差别的: 1.支持差分输入方式,测量结果为两输入端口电压差的转换的有符号数值,这个功能对 ...

  9. 绝对炫的3D幻灯片-SLICEBOX

    绝对炫的3D幻灯片-SLICEBOX http://www.jq22.com/jquery-info31

  10. 在ionic/cordova中使用Form模型验证(w5cValidator)

    在构建ionic项目过程中,当我们创建一个类似表单提交的页面时,可能会对用户的输入内容做某些规则验证,通过后再执行提交处理. 在验证的过程中,为了提供较好的用户体验,可能希望有类似于jquery Va ...