RichTextBox for WPF
C1Document クラスの使用
C1Document オブジェクトの使い方 > C1Document クラスの使用

前述のように、C1RichTextBox がコントロールコンテンツの線形的でフラットなビューを提供する一方、C1Document クラスはドキュメント構造を公開します。

ドキュメントのオブジェクトを直接操作するメリットを示すために、ユーザーが[Ctrl]キーを押したときに、Heading2 タイプのすべての段落のテキストを大文字にする機能を前の例に追加します。

C1RichTextBox が公開するオブジェクトモデルには、これを確実に実行できる機能はありません。書式設定に基づいてスパンの場所を特定する必要がありますが、それは非効率で信頼性も高くありません。ユーザーが Heading2 で使用されている書式設定と同じ書式をプレーンテキストに設定していたらどうなるでしょう。

C1Document オブジェクトモデルを使用すると、このタスクを容易に実行できます。

コードのコピー
Public Sub New()
 ' デフォルトの初期化
   InitializeComponent()
   ' ここは変更しません...
 ' 2番目の C1RichTextBox を同じドキュメントに連結します
   rtb2.Document = _rtb.Document
   AddHandler rtb2.KeyDown, AddressOf rtb2_KeyDown
End Sub
Private Sub rtb2_KeyDown(sender As Object, e As KeyEventArgs)
   If e.Key = Key.Ctrl Then
       For Each heading2 As var In _rtb.Document.Blocks.OfType(Of Heading2)()
           Dim text = heading2.ContentRange.Text
           heading2.ContentRange.Text = text.ToUpper()
       Next
  End If
End Sub
コードのコピー
public MainPage()
{
  // デフォルトの初期化
  InitializeComponent();
  // ここは変更しません...
  // 2番目の C1RichTextBox を同じドキュメントに連結します
  rtb2.Document = _rtb.Document;
  rtb2.KeyDown += rtb2_KeyDown;
}
  void rtb2_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Key == Key.Ctrl)
   {
    foreach (var heading2 in _rtb.Document.Blocks.OfType<Heading2>())
     {
      var text = heading2.ContentRange.Text;
      heading2.ContentRange.Text = text.ToUpper();
     }
   }
}

このコードはキーボード入力を監視します。ユーザーが[Ctrl]キーを押すと、ドキュメント内のすべての Heading2 要素が列挙され、そのコンテンツが大文字に変換されます。

C1RichTextBox オブジェクトモデルを使用して同じ作業を行うと、さらに多くのコードが必要になり、結果もそれほど信頼できません。