C1RichTextBox によって C1Document レイアウトを作成すると、C1TextElementView オブジェクトで構成されるツリーが平行して作成されます。C1Document ツリー内の各 C1TextElement には、レイアウトと描画の役割を担う C1TextElementView が1つ以上含まれます。
この C1Document ツリーを例にします。
対応するビューツリーは次のようになります。
各 C1TextElementView は、対応する C1TextElement の基本レイアウト情報を提供します。
Origin: ドキュメント座標によるビューの原点です。
DesiredSize: 最後に測定されたときからのビューに必要なサイズです。
レイアウトと描画を処理するために、外側の C1TextElement を複数の C1TextElementView で構成することもできます。その場合、Content プロパティには、構成内の最も内側の C1TextElementView が含まれます。コンテンツビューの子は、関連付けられている C1TextElement の Children コレクションに対応します。
ビューの構成は、Content ビューのマージン、パディング、および境界を処理するために C1BoxView で使用されます。つまり、各 C1BoxView の原点はマージン、パディング、および境界ボックスの外側で、Content の原点は内側です。
C1FlowView は、いくつかの行としてフローするボックスやテキストを表します。各行は、C1Line オブジェクトによって表されます。C1Line には、単一行のテキストだけでなく、段落全体が含まれる場合もあります。各 C1FlowView には C1Line のリストが含まれ、これらの行は常に垂直方向に積み重ねられます。各 C1Line はいくつかの C1LineFragment で構成され、これらの行フラグメントは水平方向に積み重ねられます。C1LineFragment には子要素の参照が含まれ、その原点はフラグメントの位置に一致します。
たとえば、次のコードは C1RichTextBox 内の行数をカウントします。
まず、ルートビューを取得します。これはルート要素に関連付けられているビューと同じなので、GetView を使用して rtb.Document のビューを取得します。次に、ビューツリーを走査して、各 C1FlowView で見つかった行数がカウントされます。C1Inline 要素の行数のみをカウントすることに注意してください。そうしないと、段落などのコンテナブロックもカウントしてしまいます。