老周的博客专栏:http://blog.csdn.net/tcjiaan
转载请注明原作者和出处。
上一篇文章中,我们吹了一下资源和本地化,同时也做了一个实例,本文我们再深入探索一下资源限定符和资源路径的映射。这两个玩意儿也许我们在实际开发中并不十分关注,不过,了解一下,还是有好处的。
这两个名词看起来就抽象,或者,我们会感觉到,从文字描述无法理解它们,那么,老规矩,我们还是用实验来看看是否能将抽象的概念形象化。
1、启动VS,新建一个Modern风格的应用程序项目(也就前面说过的板砖风格)。
2、在“解决方案资源管理器”中的项目节点上右击,从快捷菜单中依次选择“添加”-“新建项”,在模板列表中找到资源文件(.resw),文件名按默认Resources即可,确定。
3、在刚才新建的资源文件中,随便输入一些资源,如图:
4、保存并关闭资源文件,另外,在项目中新建两个空白页面,分别为PageQt.xaml和PageMaps.xaml,现在,你的解决方案结构应该类似下图所示。
(1)打开PageQt.xaml,界面布局参考下面的XAML。
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Name="tb" FontSize="20" TextWrapping="Wrap" Margin="3"/>
</Grid>
(2)切换到PageQt.xaml.cs,C#代码如下所示。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// 引入以下命名空间
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
namespace MyApp
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class PageQt : Page
{
public PageQt()
{
this.InitializeComponent();
this.Loaded += PageQt_Loaded;
}
void PageQt_Loaded(object sender, RoutedEventArgs e)
{
ResourceContext context = ResourceManager.Current.DefaultContext;
string resultStr = string.Empty;
foreach (var item in context.QualifierValues)
{
resultStr += string.Format("{0} => {1}", item.Key, item.Value);
resultStr += "\n";
}
this.tb.Text = resultStr;
}
}
}
(3)保存,接着打开PageMaps.xaml,XAML如下所示。
<Page
x:Class="MyApp.PageMaps"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Name="tb" FontSize="20" TextWrapping="Wrap" Margin="3"/>
</Grid>
</Page>
切换到C#代码视图,处理代码如下面清单所示:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// 引用以下命名空间
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
namespace MyApp
{
public sealed partial class PageMaps : Page
{
public PageMaps()
{
this.InitializeComponent();
this.Loaded += (sender, args) =>
{
string str = "";
foreach (var item in ResourceManager.Current.AllResourceMaps)
{
str += "-------------------- " + item.Key + " --------------------\n";
foreach (var x in item.Value)
{
str += string.Format("{0} => {1}\n", x.Key, x.Value.Uri);
}
str += "\n\n";
}
this.tb.Text = str;
};
}
}
}
5、现在回到MainPage.xaml,把页面根Grid分为两列,左边放一个ListBox,右边放一个Frame,相信你也猜到用来干啥的,对,就是用Frame来导航显示前面我们做的两个页面,一个显示资源限定符信息,另一个显示路径映射。
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox Name="lb" Grid.Column="0" SelectionChanged="onSelectionChanged">
<ListBoxItem>资源限定符</ListBoxItem>
<ListBoxItem>资源映射</ListBoxItem>
</ListBox>
<Frame x:Name="frameRight" Grid.Column="1" Margin="2"/>
</Grid>
[C# Code]
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
namespace MyApp
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
/// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。Parameter
/// 属性通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
lb.SelectedIndex = 0;
}
private void onSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox lb = sender as ListBox;
if (lb!=null)
{
int index = lb.SelectedIndex;
switch (index)
{
case 0:
this.frameRight.Navigate(typeof(PageQt));
break;
case 1:
this.frameRight.Navigate(typeof(PageMaps));
break;
default:
this.frameRight.Navigate(typeof(PageQt));
break;
}
}
}
}
}
6、打开清单文件Package.appxmanifest,然后切换到“打包”选项卡,把包名改一下,改成一个好看一点,方便查看的名字。后面有用。
现在,运行一下。
从第一张截图中,我们可以大概知道什么是资源限定符,上一篇文章中我们的例子,实现简/繁体中文切换,我们用到了限定符中的一种——语言标记。从图中我们看到,限定符有:
Language:当前应用首选的语言;
Contrast:对比度。
Scale:缩放比例。
HomeRegion:区域。
And so on.
如果你想了解更多有关限定符的东东,可以看看官方的文档。
http://msdn.microsoft.com/zh-cn/library/windows/apps/hh965372.aspx
这东西没什么技巧可言,你就按照文档说的去做就行了。
再来看看路径映射,前面我们修改包名,就是为了在这里好查看,
不知道各位在上面的截图中发现了什么规律?
1、资源路径是以ms-resource:// 打头的。
2、应用程序所认为的资源不仅仅是.resw文件,看上图,几乎把我们项目中的所有文件都列出来了。
3、那么,我们在引用某项资源时,是按key来引用的,也就是图中“=>”左边的内容。
4、重点关注一下Resources.resw的映射,从图中我们看到,Resources.resw的引用名为Resources,这个名字是默认的,还记得上一篇文章中的例子吗?我们实例化ResourceLoader时,是调用了无参数的构造函数,那是因为Resources是默认值,如果我们添加的资源文件是abc.resw,那么我们在实例化ResourceLoader时,就不能用无参构造函数了,而要传递一个引用名,按照上面我们实验得出的规律,引用名应当是abc。
继续回到上图,在Resources下的两个资源项也被映射到不同的URI,即Resources/Key1和Resources/Key2,所以,以后要引用资源,你应该懂得怎么做了。
ResourceMap类有个GetSubtree方法,它可以返回指定引用的子映射,比如,上图中,如果调用GetSubtree("Resources"),这样,返回的Map就只剩下Key1和Key2了,就是我们要找的资源项,然后在返回的ResourceMap上再调用GetValue("Key1"),就能取到资源了。
下面再做实例,看看如何从ResourceMap映射中取出资源项的值。
1、新建项目。
2、在MainPage.xaml中完成布局。
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="25">
<TextBlock FontSize="20" Text="第一个值:"/>
<TextBlock FontSize="24" Name="tb1"/>
<TextBlock FontSize="20" Margin="0,20,0,0" Text="第二个值:"/>
<TextBlock FontSize="24" Name="tb2"/>
</StackPanel>
</Grid>
3、切换到C#代码视图。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
ResourceMap map = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
tb1.Text = map.GetValue("v1").ValueAsString;
tb2.Text = map.GetValue("v2").ValueAsString;
}
然后,运行程序,查看效果。
分享到:
相关推荐
固定-固定:CSS position:fixed限定符 (c)2012 @scottjehl,细丝集团 双重许可:MIT和/或GPLv2 解释 CSS固定位置在浏览器支持上差异很大,并且很难测试。 此存储库包含一个测试,该测试试图限定CSS position:fixed...
Android的Fragment+限定符适配手机和平板。在这个Demo中,为了方便,我通过修改限定符来测试效果的。修改layout-sw400dp的数值。
android适配宽高限定符生成程序,具体操作流程详见压缩包
C存储类分为两类:自动存储类(automatic)和静态存储类(static)。 声明对象时使用的存储类说明... (1) 如果没有使用存储类说明符,或者如果使用了auto限定符,则程序块中的声明生成的都是自动存储类对象。………………
android资源限定符Excel 博文链接:https://vvlavida.iteye.com/blog/1953123
整型(int、long int 、short等)下十进制、八进制、十六进制的输入输出控制符
const限定符的使用,以及const 与 #define 的区别
android 的宽高限定符适配
java成员变量和方法的public等访问限定符的访问权限.doc
Python 正则式表达 04重复数量限定符.mp4
关于C语言中类型限定符const的研究.pdf
豆类月报:供应限定中期空间,题材决定行情节奏-0709-瑞达期货-23页.pdf
Python 正则式表达 05重复数量限定符的使用.mp4
java笔试题a说他不和x比迪特编程语言 ...)的顺序类型限定符在类型表达式中给出无关紧要:如果beefy和gnarly是类型限定符,那么beefy gnarly int和gnarly beefy int是完全等效的类型。 出现的次数也不重
博客中测试代码 【Protocol Buffer】Protocol Buffer入门教程(五):repeated限定修饰符 博客网址:https://blog.csdn.net/dengjin20104042056/article/details/102465638
const限定符 const是一种限定符,被const所限定的变量其值不可以被改变。 const的初始化 由于const一旦创建其值就不能够被改变,所以我们必须对其进行初始化 const int a;//错误,const变量必须进行初始化! const ...
Windows 7 Ultimate DIY 予約限定プレミアムセット特典 窓辺ななみ( CV : 水樹奈々)壁紙&システムボイス オリジナル Windows 7 テーマ収録 CD について ■本 CD の内容 [ MadobeNanami ] ファイル Windows 7 専用...
指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。 效果图展示 LICENSE Copyright 2018 Vension Licensed ...
主要介绍了c++ primer中的const限定符,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下