作为描述性语言,XAML使用对象元素声明和其属性调用实现不同操作。在实际项目开发中XAML为控件属性赋值,经常会遇到设计时属性值处于未知状态,而该属性值只有在应用运行时才能获取到,通过简单的XAML属性赋值语法无法实现用户需求,使用XAML标记扩展(Markup Extensions)可以轻松实现XAML页面属性赋值,资源引用,类型转换等操作。
本篇将详细讲解Windows 8应用开发,XAML的标记扩展基础概念和使用方法。(Windows 8和Silverlight 5具有类似的标记扩展概念,如果你已经具有Silverlight经验,通过本文可以快速掌握标记扩展在WinRT中的使用方法。)
标记扩展(Markup Extensions)基础概念
在.Net Framework中,标记扩展功能来自MarkupExtension抽象类,根据功能的不同,从中派生出子类。在.Net Framwork 4.5中MarkupExtension派生类(MSDN引用)如下:
而在Windows 8应用开发中,常用的XAML标记扩展功能包括:
1. Binding(绑定)标记扩展, 实现在XAML载入时,将数据绑定到XAML对象;
2. StaticResource(静态资源)标记扩展, 实现引用数据字典(ResourceDictionary)中定义的静态资源;
3. TemplateBinding(模板绑定)标记扩展, 实现在XAML页面中,对象模板绑定调用;
4. RelativeSource(绑定关联源)标记扩展,实现对特定数据源绑定;
XAML标记扩展语法格式:
<元素对象 对象属性=”{扩展标记 扩展标记属性 = 扩展属性值}” />
标记扩展(Markup Extensions)实例
例如下面代码,简单演示使用Binding标记扩展:
<TextBoxText=”{BindingPath=UserName}”/>
<TextBoxText="{BindingElementName=sliderOneTimeDataSource,Path=Value,Mode=OneTime}"HorizontalAlignment="Left"VerticalAlignment="Top"Width="150"/>
以上代码中,第一行通过使用Binding标记扩展的Path属性将UserName绑定到元素对象TextBox的Text依赖属性中,使文本内容在运行时动态显示到客户端。
而第二行代码使用Binding标记扩展中EelementBinding(对象元素绑定)功能,绑定对象sliderOneTimeDataSource.Value到TextBox的Text属性中,使文本内容在滑动条内容改变时,TextBox内容同步改变。
另外一个实例,StaticResource(静态资源)标记扩展,
<ListBoxHeight="200"ItemsSource="{BindingSource={StaticResourceteamsCVS}}">
<ListBox.ItemTemplate>
<DataTemplate>
<BorderBackground="{BindingColor}"Width="200"CornerRadius="10"HorizontalAlignment="Left">
<TextBlockText="{BindingName}"Style="{StaticResourceBasicTextStyle}"HorizontalAlignment="Center"FontWeight="Bold"/>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
上面代码中,TextBlock引用静态样式资源,Style="{StaticResource BasicTextStyle}",和Web应用CSS样式文件类似,大量样式代码定义在外部资源文件中,使用标记扩展应用对象元素样式。这样的设计方式,方便开发人员代码设计和维护。
BasicTextStyle代码如下:
<Stylex:Key="BasicTextStyle"TargetType="TextBlock">
<SetterProperty="Foreground"Value="{StaticResourceApplicationForegroundThemeBrush}"/>
<SetterProperty="FontSize"Value="{StaticResourceControlContentThemeFontSize}"/>
<SetterProperty="FontFamily"Value="{StaticResourceContentControlThemeFontFamily}"/>
<SetterProperty="TextTrimming"Value="WordEllipsis"/>
<SetterProperty="TextWrapping"Value="Wrap"/>
<SetterProperty="Typography.StylisticSet20"Value="True"/>
<SetterProperty="Typography.DiscretionaryLigatures"Value="True"/>
</Style>
相比较前两种标记扩展,TemplateBinding标记扩展使用具有局限性,必须应用于ControlTemplate中,否则XAML将解析报错。
下面代码,在一个按钮(Button)的ControlTemplate中使用TemplateBinding标记扩展,功能实现将Button.Content内容绑定到TextBlock的Text属性中,从而实现自定义控件样式模板效果。
RelatvieSource标记扩展是较为特殊的一个Markup Extension。 在前面的代码中,我们使用了ElementBinding元素绑定一个对象属性到另外一个对象属性。值得留意的是,ElementBinding元素绑定只有在源对象被命名后才能正常使用。
而对RelativeSource则允许绑定未命名源对象属性到目标对象属性。
在Windows 8中, RelatvieSource标记扩展具有两种应用模式,分别是Self Mode和TemplatedParent Mode。 其调用语法格式和前文类似,
<BindingRelativeSource="{RelativeSourceSelf}".../>
-或-
<objectproperty="{BindingRelativeSource={RelativeSourceSelf}...}".../>
<BindingRelativeSource="{RelativeSourceTemplatedParent}".../>
-或-
<objectproperty="{BindingRelativeSource={RelativeSourceTemplatedParent}...}".../>
RelativeSource使用Self模式时, 目标对象将作为源对象绑定到自身。这个模式可以实现同一对象元素不同属性之间的绑定操作。例如:
<TextBoxText="{BindingPath=UserName}"ToolTipService.ToolTip="{BindingText,RelativeSource={RelativeSourceSelf}}"/>
以上代码,附加属性ToolTipService.ToolTip使用RelativeSource标记扩展绑定控件自身Text属性,作为提示信息显示在客户端。
RelativeSource使用TemplatedParent模式时, 仅在控件模板(ControlTemplate)或者数据模板(DataTemplate)下有效。不同的模板,将返回不同类型的绑定结果。例如,在一个 ListBox数据模板(DataTemplate)中应用RelativeSource的TemplatedParent模式,则会返回 ContentPresenter模板内容到对应数据模板中。TemplatedParent模式可以帮助开发人员轻松绑定模板中的属性值到目标对象属性。例如:
<StyleTargetType="local:Calendar">
<SetterProperty="Template">
<Setter.Value>
<ControlTemplateTargetType="local:Calendar">
<Grid>
<TextBlock Text="{BindingPath=Namer,RelativeSource={RelativeSourceTemplatedParent},Mode=TwoWay}"/>
<TextBlockText="{TemplateBindingNamer}"/>
....
</Style>
值得注意的是,在控件模板(ControlTemplate)中使用RelativeSource的TemplatedParent模式,”Binding RelativeSource={RelativeSource TemplatedParent}}“等价于”{TemplateBinding}"标记扩展。
两者不同在于,TemplateBinding仅支持单向(One-Way)绑定,而RelativeSource标记扩展支持双向(Two-Way)绑定,这个功能在创建自定义控件模板时特别有用。
内置标记扩展(Markup Extensions)
在WinRT中, x:null是XAML最基础的标记扩展,其作用是设置一个nullable值到对象属性,可以用于初始化对象属性值。例如:
<object>
<object.property>
<x:Null/>
</object.property>
</object>
使用XAML标记扩展功能,可以在应用运行时为对象属性赋值,实现动态更新XAML属性,对于应用实时数据更新提供很大的帮助。
今天就讲到这里,欢迎各位留言讨论。
相关推荐
Applications = Code + Markup: A Guide to the Microsoft® Windows® Presentation Foundation By Charles Petzold ----------源代码------------------------
XAML-基础教程 pdf格式, 好东西,就不介绍了
Xaml-Spinners-WPF, 可用的WPF加载微调器 http Xaml-Spinners-WPF 免费的WPF加载微调器,这里提供完整信息: http://blackspike.com/silverlight-spinner/下面是一些我们用Blend和Illustrator制作的免费 sp
4. 标记扩展和XAML 87 5. XAML命名空间和命名空间映射 90 6. WPF名称范围 92 WPF控件开发 95 1. WPF控件开发之控件概述 95 2. 使用XAML创建按钮 103 3. WPF控件库之BUTTON 114 4. WPF控件库之MENU 115 5. WPF控件库...
python库,解压后可用。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
Xamarin XAML语言教程基础语法篇
Xamarin XAML语言教程
Xamarin XAML语言教程页面布局篇
一个能够将SVG文件转换为XAML格式以便WPF程序显示的控制台程序。命令使用格式为:Svg2XamlDemo.exe c:\data\input.svg,则会生成对应的XAML文件 c:\data\input.xaml
The cornerstone for building these new user interfaces is XAML ("Zammel"), the XML-based markup language that works with Windows Presentation Foundation (WPF), Vista's new graphics subsystem. <br>...
Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe
XML&XAML基础教程,帮你理解 XML XAML 概念 概述 语法
资源来自pypi官网。 资源全名:xaml-0.5.4-py2.py3-none-any.whl
通过扩展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 指定模板字符串,可以轻松添加地图提供者。 地图叠加层允许在地图上绘制图形...
XAML 入门经典教程,虽然为英文教程,但是容易理解,期待牛人翻译出来贡献大家,方便大家阅读,期待大家共同进步。
wfp从零开始,xaml从零开始学习,以及mvvm设计模式
23.Xaml Frame控件->导航控件
XAML语法,具有Silverlight, WPF, Windows Phone以及Windows 8开发经验的程序员,可以将开发技能再利用,加快学习速度,...编程框架能够区分用户声明的标记和框架声明的标记,并通过命名空间限定来消除可能的标记冲突