Общие сведения о модели содержимого TextElement

Обновлен: Ноябрь 2007

Данный раздел содержит основные сведения о поддерживаемом содержимом для модели TextElement. Класс Paragraph является типом TextElement. Модель содержимого описывает объекты/элементы, которые могут содержаться в других объектах. В разделе содержится обобщение модели содержимого для объектов, являющихся производными от TextElement. Дополнительные сведения см. в разделе Общие сведения о документе нефиксированного формата.

В этом разделе содержатся следующие подразделы.

  • Диаграмма модели содержимого
  • Работа с содержимым TextElement программными средствами
  • Типы, совместно использующие модель содержимого
  • Типы, которые могут содержать объекты TextElement
  • Связанные разделы

Диаграмма модели содержимого

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

Схема: схема вместимости потока содержимого

Как видно из предыдущей диаграммы, дочерние элементы не обязательно определяются тем, является ли класс производным от класса Block или Inline. Например, класс Span (производный от Inline) может иметь только дочерние элементы Inline, но класс Figure (также производный от Inline) может иметь только дочерние элементы Block. Таким образом, диаграмма может служить для быстрого определения элемента, который может содержаться в другом элементе. Для примера используем диаграмму, чтобы определить, как создать содержимое нефиксированного формата RichTextBox.

  1. Объект RichTextBox должен содержать FlowDocument, который в свою очередь должен содержать объект, производный от Block. Ниже приводится соответствующий сегмент из предыдущей диаграммы.

    Схема: правила вместимости RichTextBox

    Разметка может выглядеть следующим образом:

    <RichTextBox>
      <FlowDocument>
        <!-- One or more Block-derived object… -->
      </FlowDocument>
    </RichTextBox>
    
  2. В соответствии с диаграммой существует несколько элементов класса Block для выбора, в том числе: Paragraph, Section, Table, List и BlockUIContainer (см. классы, производные от Block, в предыдущей диаграмме). Предположим, нам требуется Table. В соответствии с предыдущей диаграммой класс Table содержит TableRowGroup, содержащий элементы TableRow, которые содержат элементы TableCell, содержащие объект, производный от класса Block. Ниже приводится соответствующий сегмент для класса 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) может принять только обычный текст.

    Схема: схема родительский/дочерний элементы для параграфа

     

    Схема: схема родительский/дочерний элементы для запуска

Ниже приведен полный пример в виде разметки.

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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.

Aa970786.alert_note(ru-ru,VS.90).gifПримечание.

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

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

В следующем примере создается новый элемент Run, который вставляется в начало объекта Span.

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

В следующем примере удаляется последний элемент Inline в объекте Span.

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

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

spanx.Inlines.Clear();

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

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

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

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

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

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

См. также

Задачи

Практическое руководство. Управление FlowDocument через свойство блоков

Практическое руководство. Управление элементами потокового содержимого через свойство Blocks

Практическое руководство. Управление FlowDocument через свойство блоков

Практическое руководство. Управление столбцами таблицы с помощью свойства столбцов

Практическое руководство. Управление группами строк таблицы пользователя с помощью свойства RowGroups