所谓资源,就是会被重复请求的事物。

XAML中最顶层的元素是一个Page,它有一个权属叫做Resource,用来定义资源。下面是来自 Programming Windows, 6th Edition的一个例子:

<Page...>
    <Page.Resources>
        <x:String x:Key="appName">Shared Brush App</x:String>
        <LinearGradientBrush x:Key="rainbowBrush">
            <GradientStop Offset="0" Color="Red" />
            <GradientStop Offset="0.17" Color="Orange" />
            <GradientStop Offset="0.33" Color="Yellow" />
            <GradientStop Offset="0.5" Color="Green" />
            <GradientStop Offset="0.67" Color="Blue" />
            <GradientStop Offset="0.83" Color="Indigo" />
            <GradientStop Offset="1" Color="Violet" />
        </LinearGradientBrush>
        <FontFamily x:Key="fontFamily">Times New Roman</FontFamily>
        <x:Double x:Key="fontSize">96</x:Double>
    </Page.Resources>
</Page>

资源是以字典的方式组织的,每个条目都有一个x:Key定义的键,然后有其对应的值。

对于x:需要多说一句,这个定义是:

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

之前提到的,XAML中默认的命令空间分给了WinRT,所以XAML给自己分配的空间倒是以x:开头。上面例子中的x:Doublex:String之类的类型被XAML解析器翻译之后会对应到编程语言的类型(比如C#中的string和double)。

资源可以通过StaticResource标记扩展来引用,比如:

<TextBlock Text="Top Text" Foreground="{StaticResource rainbowBrush}" FontFamily="{StaticResource fontFamily}" HorizontalAlignment="Center" VerticalAlignment="Top" />

Page.Resource中的另一个不曾出现在上面的例子中常客是样式(Styles):

<Page.Resources>
    ...
    <Style x:Key="rainbowStyle" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Times New Roman" />
        <Setter Property="FontSize" Value="96" />
        <Setter Property="Foreground" Value="{StaticResource rainbowBrush}" />
    </Style>
</Page.Resources>

样式的TargetType属性用来指定样式的作用对象,此例子中是一个TextBlock(派生自FrameworkElement)。样式的标签中包括了多个Setter子标签,每个子标签用来设置目标对象的DependencyProperty(前篇文章中有所介绍)。下面是样式应用的一个例子:

<TextBlock Text="Top Text"
Style="{StaticResource rainbowStyle}"
HorizontalAlignment="Center"
VerticalAlignment="Top" />

当一个样式在目标对象上生效以后,它的属性(比如Setter)是不能修改的。不过你可以更换作用在目标对象上的样式。

样式可以看作是一堆Setter属性的集合,那么一个样式也可以从另一个样式那边继承Setter属性,通过指定BasedOn权属:

<Style x:Key="gradientStyle" TargetType="TextBlock"
BasedOn="{StaticResource baseTextBlockStyle}">

另外,在Page.Resource中定义样式的时候,如果不指定样式的x:Key,那么这个样式就会变成默认样式,作用在任何没有指定样式的目标对象上。

(完)