XAML 与空格

了解 XAML 使用的空格处理规则。

空格处理

与 XML 一致,XAML 中的空格字符是空格、换行符和制表符。这些值分别对应于 Unicode 值 0020、000A 和 0009。 默认情况下,当 XAML 处理器遇到 XAML 文件中元素之间找到的任何内部文本时,会出现此空格规范化:

  • 删除东亚字符之间的换行符。
  • 所有空白字符(空格、换行符、制表符)都转换为空格。
  • 删除所有连续空格,并将其替换为一个空格。
  • 删除紧跟开始标记后面的空格。
  • 删除结束标记前的空格。
  • 东亚字符 定义为一组 Unicode 字符范围 U+20000 到 U+2FFFD,U+30000 到 U+3FFFD。 此子集有时也称为 CJK 象形字。 有关详细信息,请参阅 http://www.unicode.org

“Default”对应于 xml:space 属性的默认值所表示的状态。

内部文本中的空格和字符串基元

上述规范化规则适用于 XAML 元素中的内部文本。 规范化后,XAML 处理器会将任何内部文本转换为适当的类型,如下所示:

  • 如果属性的类型不是集合,但不是直接 对象 类型,则 XAML 处理器会尝试使用其类型转换器转换为该类型。 此处失败的转换会导致 XAML 分析错误。
  • 如果属性的类型是集合,并且内部文本是连续的(无干预元素标记),则内部文本将分析为单个 字符串。 如果集合类型不能接受 String,这也会导致 XAML 分析器错误。
  • 如果该属性的类型为 Object,则内部文本将分析为单个 字符串。 如果存在干预元素标记,则会导致 XAML 分析器错误,因为 对象 类型表示单个对象(字符串 或其他)。
  • 如果该属性的类型是集合,并且内部文本不是连续的,则第一个子字符串将转换为 字符串 并作为集合项添加,交错元素将添加为集合项,最后将尾随子字符串(如果有)作为第三个 String 项添加到集合中。

空格和文本内容模型

实际上,保留空格只涉及到某些可能的内容模型子集。 该子集由内容模型组成,这些模型可以采用某种形式的单例字符串类型、专门的字符串集合,或在列表、集合或字典中混合字符串与其他类型。

即使对于可以采用字符串的内容模型,这些模型内的默认行为是将剩余的空格视为不重要。

保留空格

在源 XAML 中保留空白的几种技术不会受到 XAML 处理器空格规范化的影响。

xml:space="preserve":在需要保留空格的元素级别指定此属性。 请注意,这将保留所有空格,包括代码编辑器或设计界面可能添加的空格,以便将标记元素对齐为视觉直观的嵌套结构。 这些空间是否会被渲染,取决于所包含元素的内容模型。 不建议在根级别指定 xml:space="preserve" ,因为大多数对象模型不会以某种方式或另一种方式将空格视为重要。 最好只在元素级别专门设置属性,这些元素在字符串中呈现空格,或者是空格重要的集合。

实体和非中断性空格:XAML 支持在文本对象模型中放置任何 Unicode 实体。 可以使用专用实体,例如非中断空间(在 UTF-8 编码中)。 还可以使用支持不间断空格字符的富文本控件。 如果您使用实体来模拟布局特征(例如缩进),请谨慎,因为实体的运行时输出受到比常规布局工具(如正确使用面板和边距)更多因素的影响,从而有所不同。