XAML 状态的语言规则:必须由 XAML 处理器实现处理重大空白。 本文介绍这些 XAML 语言规则。 它还记录了由 XAML 处理器的 Windows Presentation Foundation (WPF) 实现和 XAML 编写器定义的用于序列化的其他空白处理。
空白定义
与 XML 一致,XAML 中的空白字符是空格、换行符和制表符。这些值分别对应于 Unicode 值 0020、000A 和 0009。
空白规范化
默认情况下,当 XAML 处理器处理 XAML 文件时,会发生以下空格规范化:
删除东亚字符之间的换行符。 有关此术语的定义,请参阅本主题后面的“东亚字符”部分。
所有空格字符(空格、换行符、制表符)都转换为空格。
删除所有连续空格,并将其替换为一个空格。
删除紧跟开始标记后面的空格。
删除结束标记前的空格。
“Default”对应于 xml:space 属性的默认值所表示的状态。
内部文本和字符串基元中的空格
以前的规范化规则适用于 XAML 元素中找到的内部文本。 规范化后,XAML 处理器将任何内部文本转换为适当的类型,如下所示:
如果属性的类型不是集合,但不是直接的类型 Object ,则 XAML 处理器会尝试使用其类型转换器转换为该类型。 此处失败的转换会导致编译时错误。
如果属性的类型是集合,并且内部文本是连续的(无干预元素标记),则内部文本将分析为单个 String。 如果集合类型不能接受 String,这也会导致编译时错误。
如果该属性的类型为 Object,则内部文本将分析为单个 String文本。 如果存在干预元素标记,则会导致编译时错误, Object 因为类型表示单个对象(String 否则)。
如果属性的类型是集合,并且内部文本不是连续的,则第一个子字符串将转换为 String 作为集合项添加并添加,交错元素将添加为集合项,最后将尾随子字符串(如果有)作为第三 String 项添加到集合中。
保留空白
在源 XAML 中保留空白的几种技术,最终呈现不受 XAML 处理器空白规范化的影响。
xml:space=“preserve”:在需要空格保留的元素级别指定此属性。 这会保留所有空白,其中包括代码编辑应用程序可能会添加到“漂亮打印”对齐元素中的空格作为直观直观的嵌套。 但是,这些空间呈现是否由包含元素的内容模型确定。 避免在根级别指定 xml:space="preserve"
,因为大多数对象模型不会将空格视为重要内容,而不管如何设置属性。 在某些实现中,全局设置 xml:space
可能会对 XAML 处理(尤其是序列化)产生性能影响。 最好仅在字符串内呈现空白的元素级别设置该属性,或者是重要的空白集合。
实体和非中断性空格:XAML 支持在文本对象模型中放置任何 Unicode 实体。 可以在 UTF-8 编码中使用专用实体,例如非中断空间( )。 还可以使用支持不间断空格字符的富文本控件。 如果使用实体来模拟布局特征(如缩进),则应谨慎,因为实体的运行时输出会因因素数增加而有所不同,而不是在典型布局系统中生成缩进结果的功能,例如正确使用面板和边距。 例如,实体映射到字体,可以更改大小以响应用户字体选择。
东亚字符
“东亚字符”定义为一组 Unicode 字符范围 U+20000 到 U+2FFFD,U+30000 到 U+3FFFD。 此子集有时也称为“CJK 象形字”。 有关详细信息,请参阅 https://www.unicode.org。
空白和文本内容模型
实际上,保留空白仅涉及所有可能的内容模型的子集。 该子集由内容模型组成,这些模型可以采用某种形式的单一实例String类型、专用String集合或混合String类型或ICollection<T>集合中的其他IList类型。
WPF 中的空白和文本内容模型
为了便于说明,本部分的其余部分引用 WPF 定义的特定类型。 本文中所述的空白处理功能与 .NET XAML 服务和 WPF 相关。 若要查看此行为,可以尝试某些 WPF XAML 标记,在对象图中查看结果,然后再次序列化回标记。
即使对于可以采用字符串的内容模型,这些内容模型中的默认行为也是保留的任何空白都不会被视为重要内容。 例如, ListBox 采用一个 IList空格,但不会保留空格(如每个 ListBoxItem之间的换行符),也不会呈现。 如果尝试将换行源用作项的字符串 ListBoxItem 之间的分隔符,则它根本不起作用;行源分隔的字符串将被视为一个字符串和一个项目。
那些将空白视为重要空间的集合通常是流文档模型的一部分。 支持空白保留行为的主要集合是 InlineCollection。 此集合类使用 WhitespaceSignificantCollectionAttribute;当找到此属性时,XAML 处理器会将集合中的空白视为重要内容。 表示集合中的WhitespaceSignificantCollectionAttribute空格和空格的组合xml:space="preserve"
是保留并呈现所有空白。 一个WhitespaceSignificantCollectionAttribute内部的xml:space="default"
空格和空格的组合会导致前面所述的初始空白规范化,这会使一个空间处于特定位置,并且保留和呈现这些空间。 需要哪种行为由你决定,你应该有选择地使用 xml:space
来启用所需的行为。
此外,在流文档模型中表示换行符的某些内联元素应故意不引入额外的空间,即使在空白重要集合中也是如此。 例如,该 LineBreak 元素的用途与 <HTML 中的 BR/> 标记相同,并且为了在标记中可读性,通常 LineBreak 由创作的换行符与任何后续文本分开。 不应将该换行规范化为后续行中的前导空间。 若要启用该行为,元素的 LineBreak 类定义将应用 TrimSurroundingWhitespaceAttributeXAML 处理器解释的类定义,以表示始终剪裁周围的 LineBreak 空白。