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 の下には 1 つまたは複数の Block 要素が必要です。 簡単にするために、セル内にいくつかのテキストを配置することにします。 これは、ParagraphRun 要素と共に使用することで行うことができます。 上の図でこれに対応する部分を次に示します。ParagraphInline 要素を取ることができ、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 の派生クラスで使用されるコレクションには、次の 3 種類があります。

これらのコレクションを操作 (項目を追加または削除) するには、InlinesBlocksListItems のそれぞれのプロパティを使用します。 Span のコンテンツを Inlines プロパティを使用して操作する方法を次の例に示します。

注意

Table では、コンテンツの操作にいくつかのコレクションが使用されますが、これらのコレクションについてはここでは取り上げません。 詳細については、「テーブルの概要」を参照してください。

次の例では、新しい Span オブジェクトを作成した後、Add メソッドを使用して、2 つのテキスト ランを 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 のコンテンツ モデル」を参照してください。

関連項目