XAML实例教程系列 - 资源(Resources)
在Windows 8 Metro應(yīng)用開發(fā)中,XAML主要用于應(yīng)用界面設(shè)計(jì),無論是開發(fā)人員還是設(shè)計(jì)人員經(jīng)常會(huì)設(shè)計(jì)自定義用戶界面或者控件行為,其中會(huì)涉及到不同方面的代碼設(shè)計(jì),例如控件模板,控件樣式,動(dòng)畫設(shè)計(jì)等。為了方便設(shè)計(jì),管理和重復(fù)利用這些通用代碼,XAML提出了資源(Resources)的概念。本篇將介紹 XAML資源(Resource)。
?
XAML資源(Resources)概念?
?
資源(Resources),其概念和傳統(tǒng)Web應(yīng)用中的Cascading Style Sheets(CSS)樣式表類似,其目的為了實(shí)現(xiàn)對(duì)象的重復(fù)調(diào)用。在Windows 8 Metro應(yīng)用開發(fā)中,資源的概念不僅僅局限于對(duì)控件樣式的定義,而且還包括對(duì)控件模板的定義,對(duì)字體的控制等。在實(shí)際項(xiàng)目中,開發(fā)人員可以在資源中設(shè)置多種不同控件屬性,在多個(gè)頁面調(diào)用通用資源代碼,?這樣不僅有助于代碼重利用,同時(shí)有助于應(yīng)用維護(hù)的一致性。
?
XAML中定義資源的語法格式如下:
?
?
<根元素對(duì)象.Resources> <資源定義 /> </根元素對(duì)象.Resources>?
?
在Windows 8 Metro應(yīng)用開發(fā)中,每個(gè)Framework對(duì)象都支持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資源的概念在一定程度上簡(jiǎn)化了XAML頁面代碼,對(duì)于管理批量資源代碼集合,XAML還提供<ResourceDictionary>資源字典標(biāo)記進(jìn)行聲明。
在Windows 8 Metro應(yīng)用開發(fā)中,所有能夠被定義在資源字典(ResourceDictionary)的對(duì)象必須是可被共享使用的??梢员粦?yīng)用于資源字典的對(duì)象如下(來自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)中,每一個(gè)資源項(xiàng)必須定義x:Key,也就是所謂的唯一標(biāo)識(shí)的資源名稱,這樣可以方便讀取訪問。例如以下代碼,在Grid.Resources中定義資源x:Key = "bgBrush", 我們可以在Button中調(diào)用資源x:Key,應(yīng)用資源到控件。
?
方法一: 在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>?
?
?
方法二: 在后臺(tái)代碼中定義資源字典(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"];?
?
完成后臺(tái)代碼定義后,應(yīng)用運(yùn)行時(shí),將自動(dòng)應(yīng)用資源到對(duì)象,
<Grid?x:Name="LayoutRoot"?Background="{StaticResource?ApplicationPageBackgroundThemeBrush}">????????<Button?x:Name="btnSubmit"?Height="60"?Width="120"?Margin="112,23,168,217"/></Grid>?
?
XAML資源字典(ResourceDictionary)的分類?
?
在WPF開發(fā)中,XAML資源可被分為靜態(tài)資源(StaticResource)和動(dòng)態(tài)資源(DynamicResource)兩類,但是在Windows 8 Metro應(yīng)用開發(fā)中,XAML僅支持靜態(tài)資源(StaticResource)。
根據(jù)資源應(yīng)用域的不同,XAML資源也可被分為FrameworkElement.Resources和Application.Resources。 ?
?
FrameworkElement.Resources是將資源對(duì)象應(yīng)用于同一個(gè)對(duì)象樹的不同對(duì)象上,也可被稱為即時(shí)資源(Immediate Resources), 或者稱為頁面資源(Page Resources)。通常來說,FrameworkElement.Resources會(huì)被定義在XAML頁面根元素上。
?
Application.Resources可以被認(rèn)為是貫串整個(gè)應(yīng)用級(jí)別的資源,資源被定義在Application.Resources中,相比 FrameworkElement.Resources而言,Application.Resources應(yīng)用范圍較廣,其生命周期也比 FrameworkElement.Resources要長(zhǎng)。通常來說,Application.Resources會(huì)被定已在App.Xaml頁面。例如,在創(chuàng)建Metro應(yīng)用時(shí), Visual Studio 2012將自動(dòng)生成App.Xaml頁面,其代碼如下:
?
????????<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實(shí)例教程系列 - 標(biāo)記擴(kuò)展(Markup Extensions) "中,曾經(jīng)介紹過StaticResource(靜態(tài)資源)的引用, 這里不在贅述。
需要留意的是,資源作用域是“就近原則”,如果在對(duì)象內(nèi)部定義相關(guān)資源,對(duì)象會(huì)自動(dòng)忽略Application.Resource,應(yīng)用“最近”的資源。?
?
XAML合并資源字典屬性(ResourceDictionary.MergedDictionaries)?
為了方便調(diào)用外部資源文件,資源字典(ResourceDictionary)提供了MergedDictionaries屬性。 通常來說,合并資源字典屬性會(huì)被定義在Application.Resources, 也就是在App.xaml文件中。
在使用合并資源字典屬性時(shí),需要注意資源的查找順序;
?
在ResourceDictionary.MergedDictionaries中定義多個(gè)外部資源文件,其查找資源順序時(shí)由下往上逆行查找的。例如:
<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中定義兩個(gè)資源字典源,rd1.xaml和rd2.xaml。 如果在兩個(gè)資源文件中存在相同x:key的資源,rd2.xaml中的資源將被優(yōu)先采用。?
?
作為外部資源合并,應(yīng)用本身定義的資源永遠(yuǎn)具有較高的優(yōu)先級(jí),也就是說,如果在本地資源定義中,出現(xiàn)與rd1.xaml,rd2.xaml同名的資源, 本地資源都被會(huì)優(yōu)先采用。
?
主題資源字典屬性(ResourceDictionary.ThemeDictionaries)
在Windows 8 Metro應(yīng)用開發(fā)中,主題資源字典(ThemeDictionaries)是一個(gè)特殊的合并資源字典。其目的是為應(yīng)用提供多主題支持,提高用戶體驗(yàn)性。創(chuàng)建默認(rèn)Windows 8 Metro應(yīng)用時(shí),Visual Studio 2012將自動(dòng)生成主題資源代碼,例如:
?<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時(shí),需要為每個(gè)資源定義一個(gè)x:Key.例如上面的代碼中的Default, HighContrast.
?
Windows 8 Metro應(yīng)用提供默認(rèn)主題資源,該文件保存在?\(Program Files)\windows kits\8.0\Include\winrt\xaml\design 目錄,
?
?
?
?
對(duì)于主題資源字典(ThemeDictionaries)的應(yīng)用,將在隨后的Windows 8?Metro應(yīng)用開發(fā)實(shí)例中詳細(xì)介紹。
?
?
?
XAML實(shí)例教程系列到這里已經(jīng)全部結(jié)束,這個(gè)系列主要是為正在或者將要學(xué)習(xí)Windows 8?Metro應(yīng)用開發(fā)的新手提供XAML學(xué)習(xí)幫助,如果你在閱讀中遇到問題,歡迎留言或者郵件討論。
?
?
?
| 本篇源代碼下載 |
(Windows 8? RP & VS2012 RC)
?
?
XAML實(shí)例教程系列:
XAML實(shí)例教程系列 - 開篇 XAML實(shí)例教程系列 - 對(duì)象和屬性 XAML實(shí)例教程系列 - 命名空間(NameSpace) XAML實(shí)例教程系列 - 依賴屬性和附加屬性XAML實(shí)例教程系列 - 事件(Event)? XAML實(shí)例教程系列 - 標(biāo)記擴(kuò)展(Markup Extensions)
XAML實(shí)例教程系列 - 類型轉(zhuǎn)換器(Type Converter) XAML實(shí)例教程系列 - XAML傳遞參數(shù)到值轉(zhuǎn)換類實(shí)例
?
?
?
歡迎大家留言交流,或者加入QQ群交流學(xué)習(xí):
22308706(一群) 超級(jí)群500人?
37891947(二群) 超級(jí)群500人?
100844510(三群) 高級(jí)群200人?
32679922(四群) 超級(jí)群500人?
23413513(五群) 高級(jí)群200人?
32679955(六群) 超級(jí)群500人?
88585140(八群) 超級(jí)群500人?
128043302(九群 企業(yè)應(yīng)用開發(fā)推薦群) 高級(jí)群200人?
101364438(十群) 超級(jí)群500人?
68435160(十一群 企業(yè)應(yīng)用開發(fā)推薦群)超級(jí)群500人
?
總結(jié)
以上是默认站点為你收集整理的XAML实例教程系列 - 资源(Resources)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到刮大风发大水是什么意思
- 下一篇: 动态规划练习 13