Общие сведения о модели содержимого TextElement
В данном разделе представлены основные сведения о поддерживаемом содержимом для модели TextElement. Класс Paragraph является типом TextElement. Модель содержимого описывает объекты/элементы, которые могут содержаться в других объектах. В данном разделе содержатся обобщенные сведения о модели содержимого для объектов, являющихся производными от TextElement. Дополнительные сведения см. в разделе Общие сведения о документах нефиксированного формата.
Схема модели содержимого
На следующей схеме представлена модель содержимого для классов, производных от TextElement, и других классов, отличных от TextElement
, соответствующих этой модели.
Как видно из предыдущей схемы, дочерние элементы не обязательно определяются тем, является ли класс производным от класса Block или Inline. Например, класс Span (производный от класса Inline), может содержать только дочерние элементы Inline, но класс Figure (также производный от Inline) может содержать только дочерние элементы Block. Таким образом, схему можно использовать для быстрого определения элемента, который может содержаться в другом элементе. Для примера используем эту схему, чтобы определить, как создать содержимое нефиксированного формата RichTextBox.
В RichTextBox должен содержаться объект FlowDocument, в котором в свою очередь должен содержаться объект, производный от Block. Ниже приведен соответствующий сегмент из предыдущей диаграммы.
Разметка может выглядеть следующим образом.
<RichTextBox> <FlowDocument> <!-- One or more Block-derived object… --> </FlowDocument> </RichTextBox>
Согласно схеме, существует несколько элементов 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>
Опять же, один или несколько элементов Block должно быть по структуре ниже элемента TableCell. Для удобства поместим часть текста в ячейку. Это можно сделать, использовав 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.
InlineCollection — представляет коллекцию элементов Inline. InlineCollection определяет допустимое дочернее содержимое элементов Paragraph, Span и TextBlock.
BlockCollection — представляет коллекцию элементов Block. BlockCollection определяет допустимое дочернее содержимое элементов FlowDocument, Section, ListItem, TableCell, Floater и Figure.
ListItemCollection — элемент содержимого потока, представляющий определенный элемент содержимого в упорядоченном или маркированном List.
Существует возможность управления (добавления или удаления элементов) из этих коллекций с помощью соответствующих свойств 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.
См. также
- Управление FlowDocument с помощью свойства Blocks
- Управление элементами потокового содержимого с помощью свойства Blocks
- Управление FlowDocument с помощью свойства Blocks
- Управление столбцами таблицы с помощью свойства Columns
- Управление группами строк таблицы пользователя с помощью свойства RowGroups
.NET Desktop feedback