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

新建一个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. Java当中的反射

    1:反射的概念 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自 ...

  2. Centos7永久修改主机名

    最近在编写centos6.x的启动脚本,考虑到以后系统会升到7.x,故想让脚本兼容7.x,还是有一些和6版本不一样的地址,修改主机名比较常用,特此记录一下 1.命令行修改: hostnamectl s ...

  3. 自适应css 框架 PURE

    Bootstrap 好用 但是太大啦 有时候只需要用到媒体查询这一块的样式 Pure.css可以很好地替代 直接上地址咯: http://purecss.io/ https://unpkg.com/p ...

  4. 【前端】Three.js

    Three.js 基本概念 渲染器(Renderer) 渲染器将和Canvas元素进行绑定 场景(Scene) 在Three.js中添加的物体都是添加到场景中的,因此它相当于一个大容器.一般说,场景里 ...

  5. One Step github链接

    分享一下锤科的开源应用: https://github.com/SmartisanTech/android 官方简介: http://v.youku.com/v_show/id_XMTc2Nzg1Nj ...

  6. Java生成带小图标的二维码-google zxing 工具类

    近期一直忙于开发微信商城项目,应客户要求,要开发个有图标的二维码.经过两次改版,终于实现了该功能(第一次没有小图标,这次才整合好的),如下是完整代码 . 该代码使用Java7开发,另外使用 core- ...

  7. centos 带S权限的二进制

    早上写的一个用find查找带S权限的,感觉不记一下可惜了. [root@iZ28wg1kditZ ~]# find / -type f -exec ls -al {} \;|awk 'BEGIN {p ...

  8. codeforces 748E Santa Claus and Tangerines

    E. Santa Claus and Tangerines time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  9. img和css背景的选择

    在什么情况下更适合使用HTML IMG标签来显示一个图像,而不是一个CSS有背景图像,反之亦然? 如下场景使用img标签比较合适: 1.如果图像是等内容的一部分或图表或人(真正的人,而不是股票图人), ...

  10. [Android] keystore生成

    keytool -genkey -alias agg_keystore -keyalg RSA -validity 20000 -keystore agg.keystore keytool -expo ...