Общие сведения о модели содержимого 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, которые можно выбрать: Paragraph, Section, Table, List и BlockUIContainer (см. раздел блочных классов на предыдущей схеме). Предположим, что нам нужен объект 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. Опять же, один или несколько элементов Block должно быть по структуре ниже элемента TableCell. Для удобства поместим часть текста в ячейку. Это можно сделать, использовав Paragraph вместе с Run. Ниже приводятся соответствующие фрагменты схемы, которые демонстрируют, что 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. В следующих примерах показано, как управлять содержимым Span с помощью свойства Inlines.

Примечание.

В таблице используется несколько коллекций для управления содержимым, но они не рассматриваются в данном руководстве. Дополнительные сведения см. в разделе Общие сведения о таблицах.

В следующем примере создается новый объект 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)

В следующем примере показано удаление последнего элемента Inline в Span.

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

В следующем примере показано удаление всего содержимого (элементы Inline) из Span.

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

Типы, совместно использующие модель содержимого

Следующие типы наследуют от класса TextElement и могут быть использованы для отображения содержимого, описанного в этом обзоре.

Bold, Figure, Floater, Hyperlink, InlineUIContainer, Italic, LineBreak, List, ListItem, Paragraph, Run, Section, Span, Table, Underline.

Обратите внимание,что этот список включает только неабстрактные типы, распространяемые с набором Windows SDK. Можно использовать другие типы, наследуемые от TextElement.

Типы, которые могут содержать объекты TextElement

См. раздел Модель содержимого WPF.

См. также