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

新建一个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. js中arguments的用法

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

  2. Chapter 1: 随机事件及其概率

    1. 随机试验,样本点,样本空间 若试验具有下列特点: 在相同条件下可重复进行 每次试验的可能结果不止一个,且所有可能结果在实验前是已知的 实验前不能确定哪一个结果会发生 则称该试验为随机试验,常记为 ...

  3. apache开启.htaccess及.htaccess的使用方法(转)

    apache开启.htaccess及.htaccess的使用方法 作者: 字体:[增加 减小] 类型:转载 时间:2010-12-02 今天本地调试PHP程序,用到了.htaccess,而默认配置里面 ...

  4. linux内核追踪——find_next_bit函数详详详解

    写在前面 宗旨:把话说清楚,把道理讲透彻. 约定:所有代码均来自Linux内核2.6.24版. 建议:本文介绍得十分详细,但也略显繁琐,读者可以先看“Ⅴ.总结”部分带注释的源码,如果哪里不清楚,再回头 ...

  5. 如何修改Hadoop的默认日志级别,还真是麻烦

    鄙人使用的Hadoop版本为2.6.4.Hadoop的默认日志级别为INFO,对于百台以上的集群,如果文件操作频繁的话,NameNode会狂打日志,对性能会有一定的影响. 我们可以通过http://& ...

  6. 双模蓝牙CC2564调试笔记

    1.CC256X Testing Guide  官方文档WIKI地址:http://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Devi ...

  7. 如何监控checkbox改变

    现在想实现一个效果,即使弹幕开关,弹幕开关实际是checkbox $(document).on('change',"#barrage",function(){ if (!$(thi ...

  8. 深入理解IOC模式及Unity框架

    研究了下,有几篇博客确实已经说得很清楚了 1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html  这篇博客是通过一个 ...

  9. AspNet MVC中各种上下文理解

    0  前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...

  10. 解决IE6,IE7下子元素使用position:relative、父元素使用overflow:auto后,子元素不随着滚动条滚动的问题

    解决IE6,IE7下子元素使用position:relative.父元素使用overflow:auto后,子元素不随着滚动条滚动的问题   在IE6,IE7下,子元素使用position:relati ...