作 为描述性语言,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标记扩展:

<TextBox Text=”{Binding Path=UserName}”/>

<TextBox Text="{Binding ElementName=sliderOneTimeDataSource, Path=Value, Mode=OneTime}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="150"/>

以上代码中,第一行通过使用Binding标记扩展的Path属性将UserName绑定到元素对象TextBox的Text依赖属性中,使文本内容在运行时动态显示到客户端。

而第二行代码使用Binding标记扩展中EelementBinding(对象元素绑定)功能,绑定对象sliderOneTimeDataSource.Value到TextBox的Text属性中,使文本内容在滑动条内容改变时,TextBox内容同步改变。

另外一个实例,StaticResource(静态资源)标记扩展

<ListBox Height="200" ItemsSource="{Binding Source={StaticResource teamsCVS}}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Border Background="{Binding Color}" Width="200" CornerRadius="10" HorizontalAlignment="Left">
                                <TextBlock Text="{Binding Name}" Style="{StaticResource BasicTextStyle}" HorizontalAlignment="Center" FontWeight="Bold"/>
                            </Border>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
</ListBox>

上 面代码中,TextBlock引用静态样式资源,Style="{StaticResource BasicTextStyle}",和Web应用CSS样式文件类似,大量样式代码定义在外部资源文件中,使用标记扩展应用对象元素样式。这样的设计方 式,方便开发人员代码设计和维护。

BasicTextStyle代码如下:

<Style x:Key="BasicTextStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="{StaticResource ApplicationForegroundThemeBrush}"/>
        <Setter Property="FontSize" Value="{StaticResource ControlContentThemeFontSize}"/>
        <Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/>
        <Setter Property="TextTrimming" Value="WordEllipsis"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="Typography.StylisticSet20" Value="True"/>
        <Setter Property="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。 其调用语法格式和前文类似,
<Binding RelativeSource="{RelativeSource Self}" .../>
-或-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>
<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-或-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

RelativeSource使用Self模式时, 目标对象将作为源对象绑定到自身。这个模式可以实现同一对象元素不同属性之间的绑定操作。例如:

<TextBox Text="{Binding Path=UserName}" ToolTipService.ToolTip="{Binding Text, RelativeSource={RelativeSource Self}}" />

以上代码,附加属性ToolTipService.ToolTip使用RelativeSource标记扩展绑定控件自身Text属性,作为提示信息显示在客户端。

RelativeSource使用TemplatedParent模式时, 仅在控件模板(ControlTemplate)或者数据模板(DataTemplate)下有效。不同的模板,将返回不同类型的绑定结果。例如,在一个 ListBox数据模板(DataTemplate)中应用RelativeSource的TemplatedParent模式,则会返回 ContentPresenter模板内容到对应数据模板中。TemplatedParent模式可以帮助开发人员轻松绑定模板中的属性值到目标对象属 性。例如:

<Style TargetType="local:Calendar">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:Calendar">
                        <Grid>
                             <TextBlock Text="{Binding Path=Namer,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" />
                                <TextBlock Text="{TemplateBinding Namer}" />
....
</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属性,对于应用实时数据更新提供很大的帮助。

今天就讲到这里,欢迎各位留言讨论。

源代码下载(VS2012 RC, Windows8 RP)

运行效果:

XAML实例教程系列

XAML实例教程系列 - 开篇 
XAML实例教程系列 - 对象和属性
XAML实例教程系列 - 命名空间(NameSpace) 
XAML实例教程系列 - 依赖属性和附加属性
XAML实例教程系列 - 事件(Event)  

欢迎大家留言交流,或者加入QQ群交流学习:

22308706(一群) 超级群500人 
37891947(二群) 超级群500人 
100844510(三群) 高级群200人 
32679922(四群) 超级群500人 
23413513(五群) 高级群200人 
32679955(六群) 超级群500人 
88585140(八群) 超级群500人 
128043302(九群 企业应用开发推荐群) 高级群200人 
101364438(十群) 超级群500人

68435160(十一群 企业应用开发推荐群)超级群500人

本文转自

冷秋寒 51CTO博客,原文链接:http://blog.51cto.com/kevinfan/904606 ,如需转载请自行联系原作者

XAML实例教程系列 - 标记扩展(Markup Extensions)相关推荐

  1. XAML实例教程系列 - 资源(Resources)

    在Windows 8 Metro应用开发中,XAML主要用于应用界面设计,无论是开发人员还是设计人员经常会设计自定义用户界面或者控件行为,其中会涉及到不同方面的代码设计,例如控件模板,控件样式,动画设 ...

  2. XAML实例教程系列 - 类型转换器(Type Converter)

    在XAML中每一个对象元素映射一个实例,而实例属性可以通过特性(Attributes)进行赋值.在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使 ...

  3. XAML实例教程系列 – 对象和属性

    在前一篇已经介绍XAML概念:"XAML语言是Extensible Application Markup Language的简称,英文发音是"zammel",中文称为&q ...

  4. XAML实例教程系列 - 命名空间(NameSpace) 三

    XAML实例教程系列 - 命名空间(NameSpace) 2012-05-28 14:14 by jv9, 2205 阅读, 10 评论, 收藏, 编辑 上一篇曾提及XAML中,每个对象元素的声明是对 ...

  5. XAML实例教程系列 - 命名空间(NameSpace)

    上一篇曾提及XAML中,每个对象元素的声明是对.NET类进行一次实例化操作.XAML作为声明类语言,如何识别对象元素,并如何在.NET Framework中找到对应映射类呢?本篇将引入命名空间(Nam ...

  6. Windows 8实例教程系列 - 理解应用框架

    Windows 操作系统之所以风靡世界,是因为其"易学易用",从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windows 8继承Windows桌面的优点 ...

  7. Windows 8实例教程系列 - 开篇

    2012年10月26日,微软发布Windows 8操作系统以及自主品牌平板电脑Surface,Windows作为世界上最流行的操作系统,发布一周内,下载量超过400万.毋庸置疑 Windows Sto ...

  8. Windows 8实例教程系列 - 布局控制

    Windows 8实例教程系列 - 布局控制 原文:Windows 8实例教程系列 - 布局控制 与传统应用类似,Windows store应用允许开发人员通过布局控件管理应用UI. 本篇将讨论Win ...

  9. WPF - 自定义标记扩展

    在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等.那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢.这就是本文 ...

  10. Silverlight实例教程 - 理解Navigation导航框架Frame类

    通过"Navigation导航框架开篇"的介绍,可以了解到Silverlight导航框架可被应用于多种场合,最为常见的是实现Silverlight项目内部页面切换.在Silverl ...

最新文章

  1. IT兄弟连 JavaWeb教程 JSON和JSON字符串
  2. linux 普通用户退出vim,Linux环境下VI/VIM编辑文件时无权限保存的解决方法(普通用户)...
  3. 中国发布自主开发的域名系统基础软件 “红枫”
  4. 甲骨文正式发布Java 14(Oracle JDK 14)
  5. python贪婪匹配顺序_Python正则表达式:贪婪模式返回多个空匹配
  6. java 钩子_java中钩子方法的概念
  7. 广播变量kyro_Spark简介
  8. k8s查看pod的yaml文件_K8S系列学习,Pod实战那些事儿,有必要知道知道
  9. 尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门
  10. java京东左侧固定层_京东首页右侧固定层
  11. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
  12. PPT无法直接在页面上播放插入的MP4视频
  13. vue单表table
  14. SharePoint2010添加webpart找不到内容编辑器
  15. mysql能将查询结果与表左查询_mysql重点,表查询操作和多表查询
  16. H3CIE(WLAN)学习笔记(3)——802.11帧格式与介质访问规则
  17. 纸张的规格:A3.A4.A5.A6纸的尺寸大小
  18. 小白终是踏上了这条不归路----小文的mysql学习笔记(23)---------流程控制结构
  19. 10、持续集成流水线实践:流水线建设从Jenkins部署开始
  20. 2020-11-12杂谈

热门文章

  1. VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)
  2. 【NOIP 模拟赛】Evensgn 剪树枝 树形dp
  3. 4.28下午 听力611
  4. vue使用element案列
  5. echarts常用术语
  6. 关于阿里巴巴发布普惠体的一些思考
  7. @Autowired的使用--Spring规范解释,推荐对构造函数进行注释
  8. UVa 10491 - Cows and Cars(全概率)
  9. asp网络编程:Web程序中网页间数据传递方法小结
  10. SPendidCRM:给HK的ImageInfoEntryEditView增加一个checkbox,用于判断特殊类型的PODS记录...