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

在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.50);
            bgBrush.EndPoint = new Point(0.51);
            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人

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LCD显示深究day01 mmap知识补充

<div class"container clearfix"><main><article><h1 class"csdn_top">Linux中的mmap的使用</h1><div class"article_bar clearfix"><div class"artical_tag"><span class"origina…

Python 多线程抓取网页

From: http://www.cnblogs.com/coser/archive/2012/03/16/2402389.html 最近&#xff0c;一直在做网络爬虫相关的东西。 看了一下开源C写的larbin爬虫&#xff0c;仔细阅读了里面的设计思想和一些关键技术的实现。 1、larbin的URL去重用的很高效的bloom filter算法&#xff1…

解决vue的滚动条监听事件无效 解决vue的滚动条scrollTop距离总是为0无效问题

话不多说 直接上代码&#xff08;方法可以直接复制拿去&#xff0c; html部分需要改成你的元素的ref和点击回到顶部的方法名称&#xff09; html <section ref"scrollbox" class"inner-body"><div>这里放了很多内容 出现了滚动条</div&g…

动态规划练习 13

题目&#xff1a;Longest Ordered Subsequence (POJ 2533) 链接&#xff1a;http://acm.pku.edu.cn/JudgeOnline/problem?id2533 #include <iostream> #include <vector> using namespace std; int LIS(const vector<int> &data) { vector<int> n…

奔跑吧Linux内核初识

断更新博客有一段时间了。入职两年了一家创业公司&#xff0c;那是真心的累&#xff0c;当然了获得了技术上很大的提升。搞了两年的vr产品&#xff0c;唯一遗憾的是&#xff0c;平台是ST单片机&#xff0c;远离了系统级别的知识。回看刚出校园时的三年计划&#xff0c;和第一年…

装载问题

1、回溯法 (1)描述:回溯法是一种选优搜索法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&#xff0c;就退回一步重新选择&#xff0c;这种走不通就退回再走的技术为回溯法。 (2)原理: 回溯法在问题的…

android开发(13) 尝试在流布局中移动控件

我们常用的linearlayout,等都属于流布局&#xff0c;在流布局中如何移动控件呢&#xff1f; 我决定做个尝试。虽然可以使用绝对布局&#xff0c;但我不倾向使用这个布局。那么看看我的方式吧。 记得margin这个属性吗&#xff0c;我们就用来它来控制控件的位置&#xff0c;改动它…

阴影 border: 0 0 0 1px #4caaff;

阴影 border: 0 0 0 1px #4caaff;

第一章 处理器体系结构

1.请简述精简指令集RISC和复杂指令集CISC的区别 2.请简述数值 0x123456789 在大小端字节序处理器的存储器中的存储方式 3.请简述在你所熟悉的处理器&#xff08;比如双核Cortex-A9&#xff09;中一条存储读写指令的执行全过程 4.请简述内存屏障&#xff08;memory barrier&am…

Linux双网卡绑定实现

概述&#xff1a;通过网卡绑定&#xff0c;处理网卡单点故障&#xff0c;实验的操作系统是Redhat Linux Enterprise 5.3.绑定的前提条件&#xff1a;芯片组型号相同&#xff0c;而且网卡应该具备自己独立的BIOS芯片。网卡绑定时有四种模式&#xff0c;其中常用的是模式0和模式1…

给element的select添加复选框

需求&#xff1a;要求给select多选的时候&#xff0c;给下拉框前加上复选框样式 element select原样式 需要更改后的样式 html <el-selectv-model"searchObj.knowledgeIds"class"select-box"filterablemultiplecollapse-tagsstyle"margin-left…

TCP选项:TCP_NODELAY和TCP_CORK

From: http://blog.163.com/zhangjie_0303/blog/static/990827062012718316231/ Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程 (称为Nagling)&#xff0c;通过减少必须发送的封包的…

loop 伪设备 挂在文件系统

dd if/dev/zero of./test.img bs1M count512 losetip /dev/loop1 test.img mkfs.ext3 -L ingben /dev/loop1 dumpe2fs /dev/loop1 tune2fs -l /dev/loo1 mount /dev/loop1 /mnt hexdump -C /dev/loop1 > /dumptext.log1

mysql导入导出数据

用以下命令&#xff0c;导入导出Mysql几百M&#xff0c;几G的数据库都没有问题。注意“--default-character-setutf8”是设置编码的。 1&#xff0c;数据库备份命令&#xff1a; mysqldump -h localhost -u root -p --default-character-setutf8 dbname >backup.sq…

修改复选框样式

//默认input[type"checkbox"] {margin-top: 7px;cursor: pointer;position: relative;width: 14px;height: 14px;font-size: 14px;margin-right: 8px;background-color:#fff;}//选中后修改input[type"checkbox"]::after {position: absolute;top: 0;//修改…

java jni ubuntu 环境搭建时遇到的坑

1&#xff1a;版本不一致遇到的坑 javah的版本需要同javac的版本一致。如果版本的问题搞不定&#xff0c;直接用andorid source build之后的环境即可 2&#xff1a;javah使用遇到的坑 jni中字段描述符可以使用javah生成 javah -jni -classpath . JNIdemo 其中 -classpath…

linux 内核配置过程中遇到的问题

大家都知道在修改内核需要两步 配置和编译 在配置过程中 用到的命令 make config、make menuconfig、make xconfig 前两个是文本界面 最后一个是图形界面 不建议用最后一个 因为占用的资源太多 有点卡 但如果你的硬件配置极高 我也不否定 你来用 转入正题 我在配置时 make menu…

c如何返回数组给java

jintArray c_hello(JNIEnv *env, jobject cls, jintArray arr) { jint a[4]{12,13,14,15}; jintArray arry; arry (*env)->NewIntArray(env,4); (*env)->SetIntArrayRegion(env,arry,0,4,a); return arry; } 实际上也…

JNDI的XML相关配置(context.xml和web.xml)

1. 在tomcat目录下conf/context.xml文件中 加入一下代码   <Resource name"jdbc/sqlconnpool" auth"Container" type"javax.sql.DataSource" driverClassName"com.microsoft.sqlserver.jdbc.SQLServerDriver" …