记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 符号来加载。也趁便给大伙儿分析了运行时是如何解析 .resw 文件的。
原来说好了,后续老周会写一篇关于如安在代码里面手动加载文本资源的博文,但一直拖到今天,因为老周前阵子在忙着开发本身的 UWP 应用,已经向应用商店提交了一个版本,昨天刚提交完一次更新。
好,今天咱们就聊聊代码加载文本资源的工作。
在 XAML 中使用 uid 加载资源虽然便利,但是它有个错误谬误——差别控件有差此外属性,有时候不太便利匹配,固然了,如果你的资源所针对的控件类型不久不多,那是无所谓的。
为了弥补 uid 加载的不敷,,我们完全可以本身来编写资源加载代码。这种做法向来是老周惯用的。大家应该还记恰当年的 WinForm 应用吧,它也是可以在设计器中直接翻译和编纂资源的(.resx),然后 VS 会帮我们生成一个打点资源的类。
在实际开发中,老周一向不用这一招的,一般是本身写资源类的,这样很灵活,可以*控制,再让资源类果然一些属性,然后与 UI 进行绑定即可。在WPF中老周并没有开发过多语言的应用,所以没怎么去弄。
同样的原理,在UWP应用中我们也照样可以本身去封装,然后与 UI 绑定即可,这样本身打点起来也便利,而且可以同时用于 XAML 与非 XAML 代码上。故,还是很有意义的。有时候,多折腾一下也是好的,爱折腾的人生更出色。所以,去年春天老周学 PR,夏天学AE,秋天学CAD,冬天学葫芦丝。本年过年时学单反相机,清明节后学巴乌,劳动节后学电器维修,请在煤气公司事情的同学教我安置燃气灶,七月份学陶笛,九月份去看老师傅做丝绸卷画,十月份临摹柳公权的《玄秘塔碑》。
人一旦有工作可做,就不会痴心妄想了。
下面老周演示一个例子。
项目中放两个资源文件,一个是英文资源,一个是中文资源。
在中文资源中,输入以下三项内容。
在英文资源中,输入以下三项。
资源筹备完成后,咱们开始封装。其实,在UWP中,加载资源有个很NND简单的要领,就是用 Windows.ApplicationModel.Resources 定名空间下的
ResourceLoader 类。这个类很好用,挪用静态的 GetForCurrentView 要领就能得到一个实例,然后用 GetString 要领就可以加载到字符串资源了。
注意,GetForCurrentView 要领有两个重载,一个是带参数的,参数指定你的.resw 文件名,不带路径和扩展名,这个在前一篇鸟文中老周介绍过的,好比,本例中,资源文件为 Goods.<language tag>.resw,所以通报的参数就是 Goods。另一个是不带参数的 GetForCurrentView要领,如果挪用这个版本的重载,那么,你的 .resw 文件必需定名为 Resources.resw,如 Resources.lang-zh-cn.resw,Resources.lang-zh-tw.resw 等。
先看看封装好的类。
public class ResourcesItems : INotifyPropertyChanged { static readonly ResourcesItems mInstance = new ResourcesItems(); public static ResourcesItems Current { get { return mInstance; } } private ResourcesItems() { // 结构时加载一下,填充默认值 Load(); } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propname) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname)); } public void Load() { var loader = ResourceLoader.GetForCurrentView("Goods"); Item1 = loader.GetString("t1"); Item2 = loader.GetString("t2"); Item3 = loader.GetString("t3"); } #region 属性 string _it1, _it2, _it3; public string Item1 { get { return _it1; } set { if (value != _it1) { _it1 = value; OnPropertyChanged(nameof(Item1)); } } } public string Item2 { get { return _it2; } set { if (_it2 != value) { _it2 = value; OnPropertyChanged(nameof(Item2)); } } } public string Item3 { get { return _it3; } set { if (_it3 != value) { _it3 = value; OnPropertyChanged(nameof(Item3)); } } } #endregion }