TextElement 内容模型概述

本内容模型概述介绍 TextElement 的支持内容。 Paragraph 类是 TextElement 的一种类型。 内容模型描述哪些对象/元素可包含在其他对象/元素中。 本概述概括了派生自 TextElement 的对象所使用的内容模型。 有关详细信息,请参阅流文档概述

内容模型图

下图概括了派生自 TextElement 的类的内容模型,以及其他非 TextElement 类是如何与该模型相适应的。

Diagram: Flow content containment schema

如上面的关系图所示,元素可以具有的子元素不一定通过某个类是派生自 Block 类还是 Inline 类来确定。 例如,Span(从 Inline 派生的类)只能具有 Inline 子元素,但是 Figure(也是从 Inline 派生的类)只能具有 Block 子元素。 因此,关系图可用于快速确定哪些元素可以包含在其他元素中。 例如,可使用关系图来确定如何构造 RichTextBox 的流内容。

  1. RichTextBox 必须包含 FlowDocument,而后者又必须包含 Block 派生的对象。 以下是上述关系图中的相应部分。

    Diagram: RichTextBox containment rules

    到此为止,标记可能类似于所示内容。

    <RichTextBox>
      <FlowDocument>
        <!-- One or more Block-derived object… -->
      </FlowDocument>
    </RichTextBox>
    
  2. 按照该关系图,存在多个可以从中进行选择的 Block 元素,包括 ParagraphSectionTableListBlockUIContainer(请参阅上图中从 Block 派生的类)。 假设需要一个 Table。 按照上述关系图,Table 包含一个 TableRowGroup,后者包含多个 TableRow 元素,这些元素又包含多个 TableCell 元素,而这些元素包含一个从 Block 派生的对象。 下面是取自上述关系图的 Table 的对应部分。

    Diagram: Parent/child schema for Table

    下面是相应的标记。

    <RichTextBox>
      <FlowDocument>
        <Table>
          <TableRowGroup>
            <TableRow>
              <TableCell>
                <!-- One or more Block-derived object… -->
              </TableCell>
            </TableRow>
          </TableRowGroup>
        </Table>
      </FlowDocument>
    </RichTextBox>
    
  3. 同样,TableCell 下面需要一个或多个 Block 元素。 为简单起见,在单元格内部放置一些文本。 可以使用带有 Run 元素的 Paragraph 来实现该操作。 以下该关系图中的对应部分,其中显示,Paragraph 可以包含一个 Inline 元素,而 Run(一个 Inline 元素)只能包含纯文本。

    Diagram: Parent/child schema for Paragraph

    Diagram: Parent/Child schema for Run

下面是标记中的完整示例。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <RichTextBox>
    <FlowDocument>
      
      <!-- Normally a table would have multiple rows and multiple
           cells but this code is for demonstration purposes.-->
      <Table>
        <TableRowGroup>
          <TableRow>
            <TableCell>
              <Paragraph>

                <!-- The schema does not actually require
                     explicit use of the Run tag in markup. It 
                     is only included here for clarity. -->
                <Run>Paragraph in a Table Cell.</Run>
              </Paragraph>
            </TableCell>
          </TableRow>
        </TableRowGroup>
      </Table>

    </FlowDocument>
  </RichTextBox>
</Page>

以编程方式处理 TextElement 内容

TextElement 的内容由集合组成,因此可以通过处理这些集合以编程方式处理 TextElement 对象的内容。 从 TextElement 派生的类使用以下三个不同的集合:

可以从这些集合操作、添加或移除项,方法是分别使用 Inlines、Blocks 和 ListItems 属性来实现。 下面的示例演示如何使用 Inlines 属性来操作 Span 的内容

注意

表格使用多个集合来操作其内容,但这里不对其进行说明。 有关详细信息,请参阅表概述

以下示例创建新的 Span 对象,然后使用 Add 方法将两个文本运行添加为 Span 的内容子级。

Span spanx = new Span();
spanx.Inlines.Add(new Run("A bit of text content..."));
spanx.Inlines.Add(new Run("A bit more text content..."));
Dim spanx As New Span()
spanx.Inlines.Add(New Run("A bit of text content..."))
spanx.Inlines.Add(New Run("A bit more text content..."))

下面的示例创建一个新的 Run 元素,并将其插入到 Span 的开头。

Run runx = new Run("Text to insert...");
spanx.Inlines.InsertBefore(spanx.Inlines.FirstInline, runx);
Dim runx As New Run("Text to insert...")
spanx.Inlines.InsertBefore(spanx.Inlines.FirstInline, runx)

下面的示例删除 Span 中的最后一个 Inline 元素。

spanx.Inlines.Remove(spanx.Inlines.LastInline);
spanx.Inlines.Remove(spanx.Inlines.LastInline)

以下示例将从 Span 中清除所有内容(Inline 元素)。

spanx.Inlines.Clear();
spanx.Inlines.Clear()

共享此内容模型的类型

下面的类型继承自 TextElement 类,可用来显示本概述中介绍的内容。

BoldFigureFloaterHyperlinkInlineUIContainerItalicLineBreakListListItemParagraphRunSectionSpanTableUnderline

请注意,此列表中仅包括与 Windows SDK 一起分发的非抽象类型。 可以使用继承自 TextElement 的其他类型。

可包含 TextElement 对象的类型

请参阅 WPF 内容模型

另请参阅