标记扩展和 WPF XAML
本主题介绍 XAML 的标记扩展概念,包括其语法规则、用途以及底层的类对象模型。 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能。 本主题专门详细论述了用于 WPF XAML 的标记扩展。
本主题包括下列各节。
通常,XAML 分析器可将特性值解释为可转换成基元的文本字符串,或可通过某种方法将特性值转换为对象。 其中一种方法是引用类型转换器;详情请参见主题 TypeConverters 和 XAML。 不过,也存在要求其他行为的情况。 例如,可以指示 XAML 处理器,特性的值不应在对象图中生成新对象。 特性应生成引用对象图另一部分中的已构造对象或引用静态对象的对象图。 另一种情况是,可以指示 XAML 处理器使用向对象构造函数提供非默认参数的语法。在这些类型的情况中,标记扩展可以提供解决方案。
可以实现标记扩展以便为特性用法中的属性和/或属性元素用法中的属性提供值。
当用于提供特性值时,将标记扩展序列与 XAML 处理器区分开的语法就是左右大括号({ 和 })。 然后,由紧跟在左大括号后面的字符串标记来标识标记扩展的类型。
当用在属性元素语法中时,标记扩展在外观上与其他任何用于提供属性元素值的元素相同,即:一个将标记扩展类作为一个元素引用并以尖括号 (<>) 括起的 XAML 元素声明。
有几个标记扩展并非是 XAML 的 WPF 实现所特有的,而是语言形式的 XAML 的内部函数或功能实现。 这些标记扩展在 System.Xaml 程序集中作为常规 .NET Framework XAML 服务的一部分而实现,并且位于 XAML 语言 XAML 命名空间中。 就常见标记用法而言,这些标记扩展通常可由用法中的 x: 前缀标识。 MarkupExtension 基类(也在 System.Xaml 中定义)提供了所有标记扩展均应使用的模式,以便在 XAML 读取器和 XAML 编写器中得到支持(包括在 WPF XAML 中得到支持)。
x:Type 为命名类型提供 Type 对象。 此工具最常用于样式和模板。 有关详细信息,请参见 x:Type 标记扩展。
x:Static 生成静态值。 这些值来自不直接是目标属性值的类型、但可以计算为该类型的值类型代码实体。 有关详细信息,请参见 x:Static 标记扩展。
x:Null 将 null 指定为属性的值,可用于特性或属性元素值。 有关详细信息,请参见 x:Null 标记扩展。
在特意不使用 WPF 基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。 有关详细信息,请参见 x:Array 标记扩展。
说明 |
|---|
|
x: 前缀在 XAML 文件或生产的根元素中用于 XAML 语言内部函数的典型 XAML 命名空间映射。 例如,WPF 应用程序的 Visual Studio 模板会使用此 x: 映射启动 XAML 文件。 您可以在自己的 XAML 命名空间映射中选择不同的前缀标记,但本文档将采用默认的 x: 映射,并通过它来标识属于 XAML 语言的 XAML 命名空间已定义部分的那些实体,这与 WPF 默认命名空间或与特定框架不相关的其他 XAML 命名空间相反。 |
WPF 编程中最常用的标记扩展是支持资源引用的标记扩展(StaticResource 和 DynamicResource)以及支持数据绑定的标记扩展 (Binding)。
StaticResource 通过替换已定义资源的值来为属性提供值。 StaticResource 计算最终在 XAML 加载时进行,并且在运行时没有访问对象图的权限。有关详细信息,请参见 StaticResource 标记扩展。
DynamicResource 通过将值推迟为对资源的运行时引用来为属性提供值。 动态资源引用强制在每次访问此类资源时都进行新查找,并在运行时有权访问对象图。 为了获取此访问权限,WPF 属性系统中的依赖项属性和计算出的表达式支持 DynamicResource 概念。 因此,对于依赖项属性目标,您只能使用 DynamicResource。 有关详细信息,请参见 DynamicResource 标记扩展。
Binding 使用在运行时应用于父对象的数据上下文来为属性提供数据绑定值。 此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。 有关详细信息,请参见 绑定标记扩展。
RelativeSource 为可以在运行时对象树中定位若干可能关系的 Binding 提供源信息。 对于在多用途模板中创建的绑定,或在未充分了解周围的对象树的情况下以代码创建的绑定,上述标记扩展会提供专用源。 有关详细信息,请参见 RelativeSource MarkupExtension。
通过 TemplateBinding,控件模板可以使用来自要利用该模板的类的对象模型定义属性中的模板化属性的值。 换言之,模板定义中的属性可访问仅在应用了模板之后才存在的上下文。 有关详细信息,请参见 TemplateBinding 标记扩展。 有关 TemplateBinding 的实际使用的更多信息,请参见 Styling with ControlTemplates Sample(使用 ControlTemplates 设置样式的示例)。
ColorConvertedBitmap 支持相对高级的映像方案。 有关详细信息,请参见 ColorConvertedBitmap 标记扩展。
ComponentResourceKey 和 ThemeDictionary 支持资源查找的各个方面,特别是支持查找与自定义控件打包在一起的资源和主题。 有关更多信息,请参见ComponentResourceKey 标记扩展、ThemeDictionary 标记扩展或 控件创作概述。
标记扩展和 WPF XAML的更多相关文章
- WPF,Silverlight与XAML读书笔记(3) - 标记扩展
hystar的.Net世界 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 103 文章- 0 评论- 107 WPF,Silverlight与XAML读书笔记(3) - 标记扩展 说 ...
- wpf中xaml的类型转换器与标记扩展
原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...
- [No000012C]WPF(4/7)类型转换器和标记扩展[译]
介绍 之前讨论了WPF的基础架构,然后逐步开始学习布局面板,转换,介绍了不同的控件,容器,UI转换等.在这篇文章中,我将讨论每个创建XAML应用前的开发人员应该了解的关于XAML最重要的东西. 标记扩 ...
- XAML语法及标记扩展、附加属性、特定的字符和空白
1.对象元素语法 使用开闭标签将对象定义一个XML元素,这种语法与其他标记语言如HTML的元素语法非常相似,在以左右尖括号保卫要设置的类或结构的类型名称.对象元素可以声明0个或多个属性,以一个或多个空 ...
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- Xamarin.Forms移动开发系列5 :XAML标记扩展
摘要 本文主要讲述Xamarin.Forms中XAML的标记扩展. 前言 在Xamarin.Forms移动开发系列4 :XAML基础一文中提到过XAML标记扩展,本文将对标记扩展进行更深入的了解. 大 ...
- WPF XAML
xmlns 在xml中专门用于声明名字控件, xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 是 ...
- [No0000130]WPF 4.5使用标记扩展订阅事件
自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...
- 2.6 wpf标记扩展
1.什么是标记扩展?为什么要有标记扩展? 标记扩展是扩展xmal的表达能力 为了克服现存的类型转换机制存在的 常用的标记扩展有如下: x:Array 代表一个.net数组,它的子元素都是数组元素.它必 ...
随机推荐
- Luogu P1041 传染病控制(搜索)
P1041 传染病控制 题意 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这 ...
- Android开发 TextView的开发记录
前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...
- selenium借助AutoIt识别上传(下载)详解【转】
AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...
- Python 的一些方法
有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一个教程 ...
- Apache服务器中运行CGI程序的方法,文中以Perl脚本作为示例
关于apache与CGI在这里就不解释了. 1.apache下面以2.0.63为例介绍运行CGI程序的配置.(http://www.nklsyy.com) 2.下载Windows下的Perl解释器Ac ...
- day05 创建用户过程、文件夹,文件等权限修改等
linux创建用户时修改到的文件 /etc/passwd //存放用户信息 /etc/shadow //存放用户密码信息 /etc/group //存放用户组信息 /etc/gshadow //存放组 ...
- duilib教程之duilib入门简明教程4.响应按钮事件
上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI; 也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍下,CC ...
- LUOGU P1505 [国家集训队]旅游 (树链剖分+线段树)
传送门 解题思路 快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖. #include<iostream> #include<cstdio> #include&l ...
- nginx 解决问题
- C++写矩阵的转置
(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日) 对于任意非n阶矩阵的转置,用c++应该怎么写代码,思考了一下,发现并没有那么简单,上网找到了一个比较好 ...
说明