在Windows 8 Metro应用开发中,XAML主要用于应用界面设计,无论是开发人员还是设计人员经常会设计自定义用户界面或者控件行为,其中会涉及到不同方面的代码设计,例如控件模板,控件样式,动画设计等。为了方便设计,管理和重复利用这些通用代码,XAML提出了资源(Resources)的概念。本篇将介绍 XAML资源(Resource)。

XAML资源(Resources)概念 

资源(Resources),其概念和传统Web应用中的Cascading Style Sheets(CSS)样式表类似,其目的为了实现对象的重复调用。在Windows 8 Metro应用开发中,资源的概念不仅仅局限于对控件样式的定义,而且还包括对控件模板的定义,对字体的控制等。在实际项目中,开发人员可以在资源中设置多种不同控件属性,在多个页面调用通用资源代码, 这样不仅有助于代码重利用,同时有助于应用维护的一致性。

XAML中定义资源的语法格式如下:

<根元素对象.Resources>
<资源定义 />
</根元素对象.Resources>

在Windows 8 Metro应用开发中,每个Framework对象都支持Resources属性,也就是说,可以在不同控件或者页面定义特定的Resources, 例如,在Grid, Button定义Resources,

<Grid>
        <Grid.Resources>
           <LinearGradientBrush x:Key="bgBrush" StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Color="Yellow" Offset="0.0" />
                <GradientStop Color="Blue" Offset="0.75" />
                <GradientStop Color="Green" Offset="1.0" />
           </LinearGradientBrush>
        </Grid.Resources>
 
        <Button>
            <Button.Resources>
                 ....
            </Button.Resources>
        </Button>

</Grid>

XAML资源字典(ResourceDictionary)

XAML资源的概念在一定程度上简化了XAML页面代码,对于管理批量资源代码集合,XAML还提供<ResourceDictionary>资源字典标记进行声明。

在Windows 8 Metro应用开发中,所有能够被定义在资源字典(ResourceDictionary)的对象必须是可被共享使用的。可以被应用于资源字典的对象如下(来自MSDN):

1. Style and Template

2. Brushes and Colors

3. Animation types (Storyboard)

4. Transforms

5. Matrix and Maxtrix3D

6. Point

7. Thickness and CornerRadius

8. XAML intrinsic data types

XAML资源字典(ResourceDictionary)的定义

在资源字典(ResourceDictionary)中,每一个资源项必须定义x:Key,也就是所谓的唯一标识的资源名称,这样可以方便读取访问。例如以下代码,在Grid.Resources中定义资源x:Key = "bgBrush", 我们可以在Button中调用资源x:Key,应用资源到控件。

方法一: 在XAML中定义资源字典(ResourceDictionary),

<Grid x:Name="LayoutRoot">
        <Grid.Resources>
            <ResourceDictionary>
                <LinearGradientBrush x:Key="bgBrush" StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Color="Yellow" Offset="0.0" />
                <GradientStop Color="Blue" Offset="0.75" />
                <GradientStop Color="Green" Offset="1.0" />
            </LinearGradientBrush>
            </ResourceDictionary>   
        </Grid.Resources>
        <Button x:Name="btnSubmit" Background="{StaticResource bgBrush}"
   Height="60" Width="120" Margin="112,23,168,217"/>
</Grid> 

方法二: 在后台代码中定义资源字典(ResourceDictionary),

ResourceDictionary dict = new ResourceDictionary();
            LinearGradientBrush bgBrush = new LinearGradientBrush();
            bgBrush.StartPoint = new Point(0.5, 0);
            bgBrush.EndPoint = new Point(0.5, 1);
            GradientStopCollection stops = new GradientStopCollection();
            GradientStop stop1 = new GradientStop();
            stop1.Color = Colors.Yellow;
            stop1.Offset = 0.0;
            stops.Add(stop1);
            GradientStop stop2 = new GradientStop();
            stop2.Color = Colors.Blue;
            stop2.Offset = 0.75;
            stops.Add(stop2);
            GradientStop stop3 = new GradientStop();
            stop3.Color = Colors.Green;
            stop3.Offset = 1.0;
            stops.Add(stop3);
            bgBrush.GradientStops = stops;
            dict.Add("bgBrush", bgBrush);
            this.LayoutRoot.Resources = dict;
            this.btnSubmit.Background = (LinearGradientBrush)this.LayoutRoot.Resources["bgBrush"]; 

完成后台代码定义后,应用运行时,将自动应用资源到对象,

<Grid x:Name="LayoutRoot" Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Button x:Name="btnSubmit" Height="60" Width="120" Margin="112,23,168,217"/></Grid> 

XAML资源字典(ResourceDictionary)的分类

在WPF开发中,XAML资源可被分为静态资源(StaticResource)和动态资源(DynamicResource)两类,但是在Windows 8 Metro应用开发中,XAML仅支持静态资源(StaticResource)。

根据资源应用域的不同,XAML资源也可被分为FrameworkElement.Resources和Application.Resources。

FrameworkElement.Resources是将资源对象应用于同一个对象树的不同对象上,也可被称为即时资源(Immediate Resources), 或者称为页面资源(Page Resources)。通常来说,FrameworkElement.Resources会被定义在XAML页面根元素上。

Application.Resources可以被认为是贯串整个应用级别的资源,资源被定义在Application.Resources中,相比 FrameworkElement.Resources而言,Application.Resources应用范围较广,其生命周期也比 FrameworkElement.Resources要长。通常来说,Application.Resources会被定已在App.Xaml页面。例如,在创建Metro应用时, Visual Studio 2012将自动生成App.Xaml页面,其代码如下:

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- 
                    Styles that define common aspects of the platform look and feel
                    Required by Visual Studio project and item templates
                 -->
                <ResourceDictionary Source="Common/StandardStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary> </Application.Resources>

XAML资源(Resources)引用方法

在”XAML实例教程系列 - 标记扩展(Markup Extensions) "中,曾经介绍过StaticResource(静态资源)的引用, 这里不在赘述。

需要留意的是,资源作用域是“就近原则”,如果在对象内部定义相关资源,对象会自动忽略Application.Resource,应用“最近”的资源。

XAML合并资源字典属性(ResourceDictionary.MergedDictionaries)

为了方便调用外部资源文件,资源字典(ResourceDictionary)提供了MergedDictionaries属性。 通常来说,合并资源字典属性会被定义在Application.Resources, 也就是在App.xaml文件中。

在使用合并资源字典属性时,需要注意资源的查找顺序;

在ResourceDictionary.MergedDictionaries中定义多个外部资源文件,其查找资源顺序时由下往上逆行查找的。例如:

<Application.Resources>
    <ResourceDictionary>
      <SolidColorBrush Color="#d0157820" x:Key="muddyBrush"/>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="rd1.xaml" />
        <ResourceDictionary Source="rd2.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary></Application.Resources> 

在ResourceDictionary.MergedDictionaries中定义两个资源字典源,rd1.xaml和rd2.xaml。 如果在两个资源文件中存在相同x:key的资源,rd2.xaml中的资源将被优先采用。

作为外部资源合并,应用本身定义的资源永远具有较高的优先级,也就是说,如果在本地资源定义中,出现与rd1.xaml,rd2.xaml同名的资源, 本地资源都被会优先采用。

主题资源字典属性(ResourceDictionary.ThemeDictionaries)

在Windows 8 Metro应用开发中,主题资源字典(ThemeDictionaries)是一个特殊的合并资源字典。其目的是为应用提供多主题支持,提高用户体验性。创建默认Windows 8 Metro应用时,Visual Studio 2012将自动生成主题资源代码,例如:

<ResourceDictionary.ThemeDictionaries>

<ResourceDictionary x:Key="Default">
            <x:String x:Key="BackButtonGlyph">?</x:String>
            <x:String x:Key="BackButtonSnappedGlyph">?</x:String>
        </ResourceDictionary>

<ResourceDictionary x:Key="HighContrast">
            <x:String x:Key="BackButtonGlyph">?</x:String>
            <x:String x:Key="BackButtonSnappedGlyph">?</x:String>
        </ResourceDictionary>

<ResourceDictionary x:Key="GreenTheme">
            <SolidColorBrush x:Key="MyBackgroundBrush" Color="Green"></SolidColorBrush>
        </ResourceDictionary>

<ResourceDictionary x:Key="BlackTheme">
             <SolidColorBrush x:Key="MyBackgroundBrush" Color="Black"></SolidColorBrush>
        </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

与MergedDictionaries属性相比较,在使用ThemeDictionaries时,需要为每个资源定义一个x:Key.例如上面的代码中的Default, HighContrast.

Windows 8 Metro应用提供默认主题资源,该文件保存在 \(Program Files)\windows kits\8.0\Include\winrt\xaml\design 目录,

对于主题资源字典(ThemeDictionaries)的应用,将在随后的Windows 8 Metro应用开发实例中详细介绍。

XAML实例教程系列到这里已经全部结束,这个系列主要是为正在或者将要学习Windows 8 Metro应用开发的新手提供XAML学习帮助,如果你在阅读中遇到问题,欢迎留言或者邮件讨论。

本篇源代码下载

(Windows 8  RP & VS2012 RC)

XAML实例教程系列

XAML实例教程系列 - 开篇
XAML实例教程系列 - 对象和属性
XAML实例教程系列 - 命名空间(NameSpace)
XAML实例教程系列 - 依赖属性和附加属性

XAML实例教程系列 - 事件(Event)

XAML实例教程系列 - 标记扩展(Markup Extensions)
XAML实例教程系列 - 类型转换器(Type Converter)

XAML实例教程系列 - XAML传递参数到值转换类实例

欢迎大家留言交流,或者加入QQ群交流学习:

22308706(一群) 超级群500人 
37891947(二群) 超级群500人 
100844510(三群) 高级群200人 
32679922(四群) 超级群500人 
23413513(五群) 高级群200人 
32679955(六群) 超级群500人 
88585140(八群) 超级群500人 
128043302(九群 企业应用开发推荐群) 高级群200人 
101364438(十群) 超级群500人

68435160(十一群 企业应用开发推荐群)超级群500人

XAML实例教程系列 - 资源(Resources)相关推荐

  1. XAML实例教程系列 - 命名空间(NameSpace) 三

    XAML实例教程系列 - 命名空间(NameSpace) 2012-05-28 14:14 by jv9, 2205 阅读, 10 评论, 收藏, 编辑 上一篇曾提及XAML中,每个对象元素的声明是对 ...

  2. XAML实例教程系列 – 对象和属性

    在前一篇已经介绍XAML概念:"XAML语言是Extensible Application Markup Language的简称,英文发音是"zammel",中文称为&q ...

  3. XAML实例教程系列 - 类型转换器(Type Converter)

    在XAML中每一个对象元素映射一个实例,而实例属性可以通过特性(Attributes)进行赋值.在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使 ...

  4. XAML实例教程系列 - 命名空间(NameSpace)

    上一篇曾提及XAML中,每个对象元素的声明是对.NET类进行一次实例化操作.XAML作为声明类语言,如何识别对象元素,并如何在.NET Framework中找到对应映射类呢?本篇将引入命名空间(Nam ...

  5. Windows 8实例教程系列 - 理解应用框架

    Windows 操作系统之所以风靡世界,是因为其"易学易用",从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windows 8继承Windows桌面的优点 ...

  6. Windows 8实例教程系列 - 布局控制

    Windows 8实例教程系列 - 布局控制 原文:Windows 8实例教程系列 - 布局控制 与传统应用类似,Windows store应用允许开发人员通过布局控件管理应用UI. 本篇将讨论Win ...

  7. Windows 8实例教程系列 - 开篇

    2012年10月26日,微软发布Windows 8操作系统以及自主品牌平板电脑Surface,Windows作为世界上最流行的操作系统,发布一周内,下载量超过400万.毋庸置疑 Windows Sto ...

  8. Silverlight实例教程 - 理解Navigation导航框架Frame类

    通过"Navigation导航框架开篇"的介绍,可以了解到Silverlight导航框架可被应用于多种场合,最为常见的是实现Silverlight项目内部页面切换.在Silverl ...

  9. Silverlight实例教程 - Navigation导航框架系列汇总

    Silverlight实例教程导航框架系列,结合实例讲述Silverlight导航开发基础,该教程不仅仅适用于Silverlight,而且可以被应用于Windows Phone开发领域. 文章列表: ...

最新文章

  1. AI一分钟 | 谷歌开发者大会,千人同玩AI小程序;阿里获杭州首张自动驾驶牌照...
  2. AJAX(三)jQuery AJAX.post
  3. Hybrid App开发者一定不要错过的框架和工具
  4. 想学习linux服务器、做运维、部署项目的同学看这,linux部署
  5. python网络编程:UDP方式传输数据
  6. 没有违反GPL,他们真的给了源码
  7. 小程序引入百度地图与uni.getLocation的使用
  8. Mysql初级第二天(wangyun)
  9. java 数组 concat_JavaScript concat() 方法
  10. 在.Net中json应用测试整理
  11. PLSQL 的简单命令之三
  12. python中for循环遍历文件_Python中的用for,while循环遍历文件实例
  13. php mysql闪退_别批:mysql闪退问题如何解决??
  14. django网页倒计时(完整代码,下载即可运行)
  15. word交叉引用标题序号 编号变化问题
  16. 使用OpenOffic在线转换文档错误
  17. nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
  18. Python3 __dict__与dir()区别,对象中私有属性的访问
  19. html markdown插件,MarkDown编辑必备插件
  20. 压缩文件压缩率是什么意思

热门文章

  1. 排序算法时间复杂度和稳定性
  2. c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)
  3. 数据结构--顺序栈和链式栈
  4. 在linux下利用ls命令进行模糊查找
  5. 【Linux系统编程学习】 GCC编译器
  6. x86架构下 CF与OF标志位 带符号和无符号运算 详解
  7. 530. 二叉搜索树的最小绝对差
  8. linux里source、. 、sh、bash、./有什么区别
  9. UNIX网络编程笔记(1):TCP简介
  10. Cookie、cookie使用方法