Kevin Fan分享开发经验,记录开发点滴

XAML实例教程系列 - 资源(Resources)

2012-08-10 12:47 by jv9, 1386 阅读, 1 评论, 收藏编辑

在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)

欢迎大家留言交流,或者加入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实例教程系列 - 标记扩展(Markup Extensions) 六

    XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...

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

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

  3. XAML实例教程系列 - 依赖属性和附加属性(四)

    XAML实例教程系列 - 依赖属性和附加属性 2012-06-07 13:11 by jv9, 1479 阅读, 5 评论, 收藏, 编辑 微软发布Visual Studio 2012 RC和Wind ...

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

    XAML实例教程系列 - 类型转换器(Type Converter) 分类: Windows 8 Silverlight2012-06-25 13:40 961人阅读 评论(0) 收藏 举报 butt ...

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

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...

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

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - 事件(Event) 2012-06-19 01:36 by jv9, 1727 阅读, 7 评论, 收藏, 编辑 Events, ...

  7. XAML实例教程系列 - 对象和属性(二)

    XAML实例教程系列 - 对象和属性 2012-05-22 14:18 by jv9, 1778 阅读, 6 评论, 收藏, 编辑 在前一篇已经介绍XAML概念:“XAML语言是Extensible ...

  8. XAML实例教程系列 - 开篇(一)

    XAML实例教程系列 - 开篇 2012-05-14 11:47 by jv9, 5588 阅读, 8 评论, 收藏, 编辑 去年,曾答应银光中国论坛的朋友推出一个关于XAML语言实例教程系列,帮助学 ...

  9. Silverlight,Windows 8应用开发实例教程系列汇总

    Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...

随机推荐

  1. 03C++基本数据类型

    基本数据类型 2.2.1整型数据 短整型(short int) 有符号短整型(signed short int) 无符号短整型(unsigned short int) 一般整型(int) 有符号一般整 ...

  2. Docker 的基本使用

    一.简介 Docker 是一个开源的应用容器引擎,基于 Go 语言.Docker 支持将软件编译成一个镜像,然后在镜像中为软件做好配置,将镜像发布出去,其他使用者就可以直接使用这个镜像,而不需再和以前 ...

  3. Python中使用SQLite

    参考原文 廖雪峰Python教程 使用SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是用C写的,而且体积很小,所以经常被集成到各种应用程序中,甚至在IOS和 ...

  4. The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_60\bin;C:\Windows\Sun\Jav

    启动项目自动结束,查看日志发现 [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache To ...

  5. Anaconda安装xgboost的过程和踩过的坑

    win10下安装xgb,安装的过程波折起伏,花了5个小时,给后来人做参考喽 第一次尝试 利用以下两个软件 Git for Windows.MINGW进行安装. 安装可以参考:(https://blog ...

  6. ubutun 创建左面快捷方式

    #http://blog.csdn.net/jizi7618937/article/details/51012552

  7. 洛谷 2213 [USACO14MAR]懒惰的牛The Lazy Cow_Sliver

    [题解] 每个格子可以到达的区域是一个菱形,但是我们并不能快速的求和,所以我们可以把原来的草地旋转45度,用二维前缀和快速处理菱形的区域的和. #include<cstdio> #incl ...

  8. 最长上升子序列的回溯 ZOJ 2432

    题目大意: 找一组最长上升公共子序列,并把任意一组满足的情况输出出来 最长公共上升子序列不清楚可以先看这篇文章 http://www.cnblogs.com/CSU3901130321/p/41826 ...

  9. [luoguP3052] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper(DP)

    传送门 输出被阉割了. 只输出最少分的组数即可. f 数组为结构体 f[S].cnt 表示集合 S 最少的分组数 f[S].v 表示集合 S 最少分组数下当前组所用的最少容量 f[S] = min(f ...

  10. noip模拟赛 蒜头君的树

    分析:这道题问的是树上整体的答案,当然要从整体上去考虑. 一条边对答案的贡献是这条边一端连接的点的个数*另一端连接的点的个数*边权,可以用一次dfs来统计答案,之后每次更改操作在原答案的基础上增减就好 ...