XAML标记扩展(一)
标记扩展是一个 XAML 语言概念,常常用在 Windows 运行时 XAML 实现中。标记扩展通常表示某种“快捷方式”,它允许 XAML 文件访问无法只根据支持类型声明元素的值或行为。某些标记可通过纯字符串或其他嵌套的元素设置属性,目的是简化不同 XAML 文件之间的语法或因素处理。使用XAML标记扩展(Markup Extensions)可以轻松实现XAML页面属性赋值,资源引用,类型转换等操作。
一、标记扩展分类
Windows 运行时 XAML 支持在默认 XAML 命名空间下定义并可被 Windows 运行时 XAML 分析程序理解的标记扩展:
• Binding:支持数据绑定,它会延迟一个属性值,直到该值在仅在运行时存在的数据上下文下被解释。 此标记扩展支持很多参数。有关详细信息,请参阅绑定标记扩展。
• StaticResource:支持引用在一个 ResourceDictionary 中定义的资源值。这些资源可以位于不同的 XAML 文件中,但最终必须在加载时可供 XAML 分析器查找。{StaticResource} 用法的参数标识 ResourceDictionary 中的键控资源的键(名称)。
• ThemeResource:类似于 StaticResource 但可响应运行时主题变更。ThemeResource 经常位于 Windows 运行时的默认 XAML 模板中,因为其中的大部分模板专门用于用户在应用运行时切换主题的兼容性。
• TemplateBinding:Binding 的一种特殊情况,它支持 XAML 中的控制模板及其在运行时的最终用法。
• RelativeSource:支持一种特定形式的模板绑定,其中的值来自于父模板。
• CustomResource:适用于资源查找的高级场景。
二、StaticResource
因为我最早用到的标记扩展语法是StaticResource,而且也经常使用,所以先从它说起。StaticResource可以引用事先定义好的资源,如Style和某些控件,从而实现资源引用的功能。
<Page.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Yellow" />
<Style TargetType="Button" x:Key="MyButtoStyle">
<Setter Property="Background" Value="Bule" />
<Setter Property="FontFamily" Value="Arial Black" />
</Style>
</Page.Resources>
<StackPanel Margin="20,30,0,0">
<TextBlock Text="APP NAME" Foreground="{StaticResource MyBrush}" />
<TextBlock Text="page name" />
<Button Content="My Brush Example"
Height="100"
Background="{StaticResource MyBrush}"
Style="{StaticResource MyBrushStyle}" />
</StackPanel>
上面代码在StackPanel中定义了下面代码需要引用的资源,x:Key指明了定义的资源的名称,以方便其它控件引用它。在TextBlock和Button中都引用了StaticResource,即:
Foreground="{StaticResource MyBrush}"
Background="{StaticResource MyBrush}"
Style="{StaticResource MyBrushStyle}"
引用StaticResource的语法如下:
<object property="{StaticResource key}"
其次,引用StaticResourc中的相同属性可以实现覆盖,上例中,Button先后引用了两个StaticResources,第一个引用StaticResource MyBrush中定义其颜色为Yellow, 而下面的StaticResource MyBrushStyle却定义其颜色为Blue,优先定义的属性将对后序定义的属性实施覆盖,即最终效果是Button的颜色为黄色。
此外,如果你想让APP的所有页面都可以将预先定义的资源实现引用,可以将资源定义在App.xaml文件。
使用StaticResource的一大好处是:当你想改变APP的风格时,你不需要每个控件的风格,你只需将提前定义好的资源的属性加以改变,就可实现全局改变。