Поделиться через


Обзор модели содержимого TextElement

В этом обзоре модели содержимого описывается поддерживаемое содержимое для TextElement. Класс Paragraph — это тип 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 (см. классы, производные от блоков на предыдущей схеме). Предположим, что мы хотим 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. Снова требуется, чтобы под TableCellнаходился один или несколько элементов Block. Чтобы сделать его простым, давайте поместим текст внутри ячейки. Это можно сделать с помощью Paragraph с элементом Run. Ниже приведены соответствующие сегменты на схеме, показывающие, что Paragraph может принимать элемент Inline и что элемент Run (элемент Inline) может принимать только обычный текст.

    Диаграмма : родительская/дочерняя схема для абзаца

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

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

<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 -derived классами:

Вы можете управлять этими коллекциями (добавлять или удалять элементы) с помощью соответствующих свойств встроенных, блокови элементов списков. В следующих примерах показано, как изменять содержимое элемента 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)

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

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

Типы, которые используют эту модель содержимого

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

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

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

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

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

См. также