一. 资源(Resources)
1. 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>
2. 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
3. XAML 资源字典(ResourceDictionary)的定义
在资源字典(ResourceDictionary)中,每一个资源项必须定义 x:Key,也就是所谓的唯一标识的资源名称,这样可以方便读取访问。
例如以下代码,在 Grid.Resources 中定义资源 x:Key = "bgBrush", 我们可以在 Button 中调用资源 x:Key,应用资源到控件。
定义资源字典的方法:
方法一:在 XAML 中定义资源字典
<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>
4. 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>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
5. XAML 资源(Resources)引用方法
在”XAML 实例教程系列 - 标记扩展(Markup Extensions) "中,曾经介绍过 StaticResource (静态资源)的引用, 这里不在赘述。
需要留意的是,资源作用域是“就近原则”,如果在对象内部定义相关资源,对象会自动忽略 Application.Resource,应用“最近”
的资源。
6. 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 同名的资源, 本地资源都被会优先采用。
7. 主题资源字典属性(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>
8.
1. 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>
2. 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
3. XAML 资源字典(ResourceDictionary)的定义
在资源字典(ResourceDictionary)中,每一个资源项必须定义 x:Key,也就是所谓的唯一标识的资源名称,这样可以方便读取访问。
例如以下代码,在 Grid.Resources 中定义资源 x:Key = "bgBrush", 我们可以在 Button 中调用资源 x:Key,应用资源到控件。
定义资源字典的方法:
方法一:在 XAML 中定义资源字典
<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>
4. 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>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
5. XAML 资源(Resources)引用方法
在”XAML 实例教程系列 - 标记扩展(Markup Extensions) "中,曾经介绍过 StaticResource (静态资源)的引用, 这里不在赘述。
需要留意的是,资源作用域是“就近原则”,如果在对象内部定义相关资源,对象会自动忽略 Application.Resource,应用“最近”
的资源。
6. 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 同名的资源, 本地资源都被会优先采用。
7. 主题资源字典属性(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>
8.