C1RichTextBox によって C1Document レイアウトを作成すると、C1TextElementView オブジェクトで構成されるツリーが並行して作成されます。C1Document ツリー内の各 C1TextElement には、レイアウトと描画の役割を担う C1TextElementView が1つ以上含まれます。
この C1Document ツリーを例にします。

対応するビューツリーは次のようになります。

各 C1TextElementView は、対応する C1TextElement の基本レイアウト情報を提供します。
C1TextElementView.Origin: ドキュメント座標によるビューの原点です。
C1TextElementView.DesiredSize: 最後に測定されたときからのビューに必要なサイズです。
レイアウトと描画を処理するために、外側の C1TextElement を複数の C1TextElementView で構成することもできます。その場合、C1TextElementView.Content プロパティには、構成内の最も内側の C1TextElementView が含まれます。コンテンツビューの子は、関連付けられている C1TextElement の C1TextElementView.Children コレクションに対応します。
ビューの構成は、C1TextElementView.Content ビューのマージン、パディング、および境界を処理するために C1BoxView で使用されます。つまり、各 C1BoxView の原点はマージン、パディング、および境界ボックスの外側で、C1TextElementView.Content の原点は内側です。
C1FlowView は、いくつかの行としてフローするボックスやテキストを表します。各行は、C1Line オブジェクトによって表されます。C1Line オブジェクトには、単一行のテキストだけでなく、段落全体が含まれる場合もあります。各 C1FlowView には C1Line のリストが含まれ、これらの行は常に垂直方向に積み重ねられます。各 C1Line はいくつかの C1LineFragment で構成され、これらの行フラグメントは水平方向に積み重ねられます。C1LineFragment には子要素の参照が含まれ、その原点はフラグメントの位置に一致します。
たとえば、次のコードは C1RichTextBox 内の行数をカウントします。
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Private Function CountLines(rtb As C1RichTextBox) As Integer
Dim root = rtb.ViewManager.GetView(rtb.Document)
Return CountLines(root)
End Function
Private Function CountLines(view As C1TextElementView) As Integer
Dim count As Integer = 0
Dim flow = TryCast(view, C1FlowView)
If flow IsNot Nothing Then
For Each line As var In flow.Lines
If TypeOf line.Fragments.First().Element Is C1Inline Then
count += 1
End If
Next
End If
For Each child As var In view.Children
count += CountLines(child)
Next
Return count
End Function
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
int CountLines(C1RichTextBox rtb)
{
var root = rtb.ViewManager.GetView(rtb.Document);
return CountLines(root);
}
int CountLines(C1TextElementView view)
{
int count = 0;
var flow = view as C1FlowView;
if (flow != null)
{
foreach (var line in flow.Lines)
{
if (line.Fragments.First().Element is C1Inline)
{
++count;
}
}
}
foreach (var child in view.Children)
{
count += CountLines(child);
}
return count;
}
|
|
まず、ルートビューを取得します。これはルート要素に関連付けられているビューと同じなので、C1RichTextViewManager.GetView を使用して rtb.Document のビューを取得します。次に、ビューツリーを走査して、各 C1FlowView で見つかった行数がカウントされます。C1Inline 要素の行数だけをカウントすることに注意してください。そうしないと、段落などのコンテナブロックもカウントしてしまいます。