在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),
<Gridx:Name="LayoutRoot"><Grid.Resources><ResourceDictionary><LinearGradientBrushx:Key="bgBrush"StartPoint="0.5,0"EndPoint="0.5,1"><GradientStopColor="Yellow"Offset="0.0"/><GradientStopColor="Blue"Offset="0.75"/><GradientStopColor="Green"Offset="1.0"/></LinearGradientBrush></ResourceDictionary></Grid.Resources><Buttonx:Name="btnSubmit"Background="{StaticResourcebgBrush}"
Height="60"Width="120"Margin="112,23,168,217"/></Grid>
方法二: 在后台代码中定义资源字典(ResourceDictionary),
ResourceDictionarydict=
newResourceDictionary();
LinearGradientBrushbgBrush=
newLinearGradientBrush();
bgBrush.StartPoint=
newPoint(
0.5,
0);
bgBrush.EndPoint=
newPoint(
0.5,
1);
GradientStopCollectionstops=
newGradientStopCollection();
GradientStopstop1=
newGradientStop();
stop1.Color=Colors.Yellow;
stop1.Offset=
0.0;
stops.Add(stop1);
GradientStopstop2=
newGradientStop();
stop2.Color=Colors.Blue;
stop2.Offset=
0.75;
stops.Add(stop2);
GradientStopstop3=
newGradientStop();
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"];
完成后台代码定义后,应用运行时,将自动应用资源到对象,
<Gridx:Name="LayoutRoot"Background="{StaticResourceApplicationPageBackgroundThemeBrush}">
<Buttonx: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><!--
Stylesthatdefinecommonaspectsoftheplatformlookandfeel
RequiredbyVisualStudioprojectanditemtemplates
--><ResourceDictionarySource="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><SolidColorBrushColor="#d0157820"x:Key="muddyBrush"/><ResourceDictionary.MergedDictionaries><ResourceDictionarySource="rd1.xaml"/><ResourceDictionarySource="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>
<ResourceDictionaryx:Key="Default">
<x:Stringx:Key="BackButtonGlyph"></x:String>
<x:Stringx:Key="BackButtonSnappedGlyph"></x:String>
</ResourceDictionary>
<ResourceDictionaryx:Key="HighContrast">
<x:Stringx:Key="BackButtonGlyph"></x:String>
<x:Stringx:Key="BackButtonSnappedGlyph"></x:String>
</ResourceDictionary>
<ResourceDictionaryx:Key="GreenTheme">
<SolidColorBrushx:Key="MyBackgroundBrush"Color="Green"></SolidColorBrush>
</ResourceDictionary>
<ResourceDictionaryx:Key="BlackTheme">
<SolidColorBrushx: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 8Metro应用开发实例中详细介绍。
XAML实例教程系列到这里已经全部结束,这个系列主要是为正在或者将要学习Windows 8Metro应用开发的新手提供XAML学习帮助,如果你在阅读中遇到问题,欢迎留言或者邮件讨论。
(Windows 8 RP & VS2012 RC)
XAML实例教程系列:
XAML实例教程系列 - 标记扩展(Markup Extensions)
XAML实例教程系列 - XAML传递参数到值转换类实例
欢迎大家留言交流,或者加入交流学习:
22308706(一群) 超级群500人
37891947(二群) 超级群500人
100844510(三群) 高级群200人
32679922(四群) 超级群500人
23413513(五群) 高级群200人
32679955(六群) 超级群500人
88585140(八群) 超级群500人
128043302(九群 企业应用开发推荐群) 高级群200人
101364438(十群) 超级群500人
68435160(十一群 企业应用开发推荐群)超级群500人
分享到:
相关推荐
XAML-基础教程 pdf格式, 好东西,就不介绍了
Xaml-Spinners-WPF, 可用的WPF加载微调器 http Xaml-Spinners-WPF 免费的WPF加载微调器,这里提供完整信息: http://blackspike.com/silverlight-spinner/下面是一些我们用Blend和Illustrator制作的免费 sp
python库,解压后可用。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
Xamarin XAML语言教程基础语法篇
Xamarin XAML语言教程
WPF开发教程.rar 目录 WPF基础入门 3 1. WPF基础之体系结构 3 2. WPF基础之XAML 9 3. WPF基础之基元素 23 4. WPF基础之属性系统 26 5. WPF基础之路由事件 33 6. WPF基础之布局系统 46 7. WPF基础之样式设置和模板化...
Xamarin XAML语言教程页面布局篇
资源来自pypi官网。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
XML&XAML基础教程,帮你理解 XML XAML 概念 概述 语法
一个能够将SVG文件转换为XAML格式以便WPF程序显示的控制台程序。命令使用格式为:Svg2XamlDemo.exe c:\data\input.svg,则会生成对应的XAML文件 c:\data\input.xaml
wfp从零开始,xaml从零开始学习,以及mvvm设计模式
Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe
XAML 入门经典教程,虽然为英文教程,但是容易理解,期待牛人翻译出来贡献大家,方便大家阅读,期待大家共同进步。
XAML in a Nutshell covers everything necessary to design user interfaces and .NET applications that take advantage of WPF. Prerequisites such as Microsoft's new unified build system, MSBuild, and core...
XAML 地图控件一组用于 WPF、UWP 和 WinUI 的控件,用于渲染来自不同提供商的数字地图和各种类型的地图叠加层。 通过为其地图图块 URL 指定模板字符串,可以轻松添加地图提供者。 地图叠加层允许在地图上绘制图形...
23.Xaml Frame控件->导航控件
XAML语法,具有Silverlight, WPF, Windows Phone以及Windows 8开发经验的程序员,可以将开发技能再利用,加快学习速度,提高开发效率 语言性能强大,学习曲线平缓, 有强大的开发工具支持 XAML是Windows 8 Style风格...
以实例方式说明WPF MaterialDesignInXaml 的使用,内容详细,思路清晰,实战性强。
react-native-xaml通过利用元数据获取XAML属性,类型和事件来工作。 此元数据是从Windows SDK自动生成的(生成)。 这意味着我们可以完全投影所有XAML或由应用程序开发人员编写的任何WinRT组件,这些组件可以导出 ...
0 大家都知道 XAML是“用来设计UI”的 设计师用XAML设计出来的UI其后台代码(程序逻辑)可以由程序员用C#或者VB去写 这叫做Code behind 实际上 设计师用XAML和程序用C#都是在构建同一个类 换句话说就是:把一个类劈...