Resource Dictionary –资源字典

所有的资源项在最终都会被整合到Resource Dictionary中的,也就是说无论是FrameworkElement的Resources,还是Window的Resources,还是Application的Resources,还是特定的ResourceDictionary中定义的resources在整个应用编译执行的时候实际上他们都在一起的作为可遍历集合共同存在于一个相对会话空间内的。

我们也提到过Resource的key是可以被允许有相同的,这样在遍历不同相对地址的Resource Dictionary时会根据StaticResource或者DynamicResource的lookup behavior来确定哪个有效。通常为了维护和灵活性的考虑,我们通常会将Resource Dictionary文件分成好几个,但在某些场合下我们只需要用其中某些资源,那么我么可以将资源从几个独立的文件中提取并合并,那么可以这么做:

<Window.Resources>

<ResourceDictionary>

<ResourceDictionary.MergedDictionaries>

<ResourceDictionary Source="Diction1.xaml"></ResourceDictionary>

<ResourceDictionary Source="Diction2.xaml"></ResourceDictionary>

</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

</Window.Resources>

Localization – 本地化

本地化和换肤其实都是在用ResourceDictionary来做文章的。说白了,Localization就是用不同语言下取不同事先设定好的资源来显示而已。要做到这些很容易,4步就可以轻松实现:

  • 定义Resource Dictionary来包含不同语言下要显示的资源项。

创建单独的Resource Dictionary文件,并以语言本身名字来命名,并把en-US来作为默认语言环境(这里顺便就命名为default.xaml了)

Default.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:sys="clr-namespace:System;assembly=mscorlib">

<sys:String x:Key="Title_PM">Project Manager</sys:String>

<sys:String x:Key="Title_PL">Project Lead</sys:String>

<sys:String x:Key="Title_SD">Senior Developer</sys:String>

<sys:String x:Key="Title_SA">System Architecture</sys:String>

</ResourceDictionary>

zh-CN.xaml (注意对.NET命名空间的引用)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:sys="clr-namespace:System;assembly=mscorlib">

<sys:String x:Key="Title_PM">项目经理</sys:String>

<sys:String x:Key="Title_PL">项目主管</sys:String>

<sys:String x:Key="Title_SD">资深开发工程师</sys:String>

<sys:String x:Key="Title_SA">系统架构师</sys:String>

</ResourceDictionary>

·         给应用程序添加默认资源:其实就是将默认的Resource Dictionary加入到Application的全局Resource里边。

<Application x:Class="WpfApplication1.App"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

StartupUri="Window1.xaml">

<Application.Resources>

<ResourceDictionary>

<ResourceDictionary.MergedDictionaries>

<ResourceDictionary Source="Language\default.xaml"/>

</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

</Application.Resources>

</Application>

在Application启动时根据不同语言来加载以语言命名的XAML文件(Resource Dictionary)。因为对于重名的资源,后来加载的资源将会胜出,所以以当前语言名加载的XAML文件中的资源项将会被引用。这就是多语言的本质!

public partial class App : Application

{

protected override void OnStartup(StartupEventArgs e)

{

base.OnStartup(e);

LoadLanguage();

}

private void LoadLanguage()

{

CultureInfo currentCultureInfo = CultureInfo.CurrentCulture;

ResourceDictionary langRd = null;

try

{

langRd = Application.LoadComponent(

new Uri(@"Language\" + currentCultureInfo.Name + ".xaml", UriKind.Relative)) as ResourceDictionary;

}

catch

{

}

if (langRd != null)

{

if (this.Resources.MergedDictionaries.Count > 0)

{

this.Resources.MergedDictionaries.Clear();

}

this.Resources.MergedDictionaries.Add(langRd);

}

}

}

在XAML中引用资源。

<TextBlock Canvas.Top="50" Width="100" Height="24" Text="{StaticResource Title_PM}" />

大功告成,运行程序你会看到默认的语言的显示:Project Manager.当然如果你的默认文化是英语的话。用程序换成中文试试结果?没问题,在LoadLanguage()之前更改语言即可:

base.OnStartup(e);(就是写在application的OnStartup事件里)

CultureInfo info = new CultureInfo("zh-CN");

Thread.CurrentThread.CurrentCulture = info;

Thread.CurrentThread.CurrentUICulture = info;

LoadLanguage();

资源:Localization – 本地化的更多相关文章

  1. iOS Programming Localization 本地化

    iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...

  2. iOS开发那些事-iOS应用本地化-资源文件本地化

    资源文件包括:图片文件.音频文件以及前文提到的Localizable.strings等文件,它们的特点是都是随着应用一起打包发布.但就本地化而言无论是图片文件还是音频文件都必须实现的步骤都是类似的,因 ...

  3. 20、资源与本地化 System.Resources

    可以将字符串.图像或对象数据等资源包含在资源文件中,方便应用程序使用. .NET Framework 提供了五种创建资源文件的方法: •创建一个包含字符串资源的文本文件.或创建一个包含字符串.图像或对 ...

  4. ABP文档 - 本地化

    文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...

  5. ABP源码分析十二:本地化

    本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...

  6. (新年快乐)ABP理论学习之本地化(2016第一篇)

    返回总目录 本篇目录 应用语言 本地化资源 获取本地化文本 扩展本地化资源 最佳实践 应用语言 一个应用至少有一种UI语言,许多应用不止有一种语言.ABP为应用提供了一个灵活的本地化系统. 第一件事情 ...

  7. DDD开发框架ABP之本地化/多语言支持

    本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...

  8. WPF学习之资源-Resources

    WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...

  9. IOS本地化应用

    BK项目已完成7788,在项目的后期需要被翻译成多国语言版.为了适应全球多个国家使用多个存储. 应用本地化是分别对字符串.图片和 xib 或 storyboard 文件本地化,而传统的做法是对 xib ...

随机推荐

  1. c语言中的main函数讨论

    **从刚开始写C程序,相比大家便开始写main()了.虽然无数的教科书和老师告诉我们main是程序的入口.那么main函数是怎么被调用的,怎么传入参数,返回的内容到哪里了,返回的内容是什么?接下来我们 ...

  2. python fromkeys的坑

    有个不定长的列表,想把列表中的每个值当做字典的key, 初始值为空列表,于是想到了fromkeys这个方法 In [337]: l = ['a','b','c'] In [338]: res = di ...

  3. javascript 省市二级联动

    通过遍历二维数组 获取到 二级列表的 每个option 然后onchange事件 获取到省,然后循环遍历该省具有的市并将遍历到的市添加到id为city的选择器中. 获取完需要清空二级列表的内容,不然不 ...

  4. JAVA基础之Set接口

    个人理解: Set接口是Collection接口的子类,其继承了所有方法,HashSet集合则实现了Set接口,其内部存储数据时依靠哈希表,一个类似数组和链表的结合体.设置空集合时,存在默认的容量和加 ...

  5. 在红米note4上实现自动安装软件

    因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装APK,但是红米会弹出继续安装的按钮,手点一次比较烦,想自动点"继续安装"按钮! 感谢先行者们的分享 本文参考 ...

  6. flash+xml无法显示中文的解决办法

    flash+xml用来做图片动态浏览效果相当不错,被广泛运用于电子相册制作,很多朋友都会从网上下载一些相关的flash源码下载参考,但是经常发现在使用过程中,修改了xml文件中的英文后要么文本不显示, ...

  7. DotnetBrowser入门教程-入门

    在.net core时代,web开发基本可以用.net core 2.0取代了.但是在传统领域,桌面开发仍然是不可以抛弃的,譬如: 1.用户需要和串口或者硬件打交道. 2.用户只想简单的安装好就使用, ...

  8. struts2中迭代的使用方法

    struts2  Html代码   <s:iterator value="resultList" id="user" status="st&qu ...

  9. Python标准库:1. 介绍

    标准库包括了几种不同类型的库. 首先是那些核心语言的数据类型库,比方数字和列表相关的库.在核心语言手冊里仅仅是描写叙述数字和列表的编写方式,以及它的排列,而未定义它的语义. 换一句话说,核心语言手冊仅 ...

  10. thinkphp5 中使用postgresql 缺少函数 table_msg

    参考解决办法 在postgresql 中执行命令 插入函数 https://blog.csdn.net/sinat_35767703/article/details/76070236?utm_sour ...