首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

win8开发(七)——资源限定符和资源映射

2012-12-17 
win8开发(7)——资源限定符和资源映射上一篇文章中,我们吹了一下资源和本地化,同时也做了一个实例,本文我们

win8开发(7)——资源限定符和资源映射

上一篇文章中,我们吹了一下资源和本地化,同时也做了一个实例,本文我们再深入探索一下资源限定符和资源路径的映射。这两个玩意儿也许我们在实际开发中并不十分关注,不过,了解一下,还是有好处的。
这两个名词看起来就抽象,或者,我们会感觉到,从文字描述无法理解它们,那么,老规矩,我们还是用实验来看看是否能将抽象的概念形象化。

1、启动VS,新建一个Modern风格的应用程序项目(也就前面说过的板砖风格)。
2、在“解决方案资源管理器”中的项目节点上右击,从快捷菜单中依次选择“添加”-“新建项”,在模板列表中找到资源文件(.resw),文件名按默认Resources即可,确定。
3、在刚才新建的资源文件中,随便输入一些资源,如图:
win8开发(七)——资源限定符和资源映射 


4、保存并关闭资源文件,另外,在项目中新建两个空白页面,分别为PageQt.xaml和PageMaps.xaml,现在,你的解决方案结构应该类似下图所示。

win8开发(七)——资源限定符和资源映射 

(1)打开PageQt.xaml,界面布局参考下面的XAML。
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">      <TextBlock Name="tb" FontSize="20" TextWrapping="Wrap" Margin="3"/>  
    </Grid>  
切换到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,然后切换到“打包”选项卡,把包名改一下,改成一个好看一点,方便查看的名字。后面有用。 
            win8开发(七)——资源限定符和资源映射
            现在,运行一下。
            win8开发(七)——资源限定符和资源映射 

            win8开发(七)——资源限定符和资源映射 
            从第一张截图中,我们可以大概知道什么是资源限定符,上一篇文章中我们的例子,实现简/繁体中文切换,我们用到了限定符中的一种——语言标记。从图中我们看到,限定符有:Language:当前应用首选的语言;Contrast:对比度。Scale:缩放比例。HomeRegion:区域。And so on.如果你想了解更多有关限定符的东东,可以看看官方的文档。官方文档
            这东西没什么技巧可言,你就按照文档说的去做就行了。
            再来看看路径映射,前面我们修改包名,就是为了在这里好查看,
            win8开发(七)——资源限定符和资源映射 
            不知道各位在上面的截图中发现了什么规律?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;  
              • }  

                然后,运行程序,查看效果
                win8开发(七)——资源限定符和资源映射

                3.png (9.05 KB, 下载次数: 0)

                win8开发(七)——资源限定符和资源映射

热点排行