ペインタは、C1RichTextBox がテキストを表示するキャンバスと同じキャンバスに UIElement を表示することで、C1RichTextBox 拡張します。これは、スタイルのオーバーライドより汎用的な拡張を可能にしますが、使い方は多少難しくなります。C1RichTextBox では、選択範囲を表示するためにペインタを内部的に使用しています。
ペインタは、IRichTextPainter インタフェースの実装です。このインタフェースには Paint と PaintInline の2つのメソッドがあり、それぞれ C1RichTextBox の描画パスの異なる段階で呼び出されます。各メソッドは、描画されるビューポートのチェックに使用される C1PaintingContext オブジェクトを受け取り、カスタム UIElement を描画するためのメソッドを持ちます。
Paint は、画面全体が再描画されるたびに呼び出されます。このメソッドが呼び出されるたびに、Paint を呼び出すことによってすべての UIElements を描画する必要があります。そうしないと、要素が削除されます。毎回同じ UIElement を渡す方が、ビジュアルツリーから削除されないので効率的です。
PaintInline は、描画される C1Line ごとに呼び出されます。このメソッドを使用すると、カスタム UIElement を描画するレイヤを細かく制御できます。たとえば、要素をテキストの背景の上で、かつテキスト自体の下に描画することができます。ルールは、Paint と同じです。PaintInline を呼び出して、すべての UIElement を描画する必要があります。そうしないと、要素が削除されます。
Annotations サンプルは、ペインタを使用して付箋を表示します。実装は次のとおりです。
StickyPainter は、Paint メソッドのみを使用します。このメソッドは、各付箋に対してドキュメント内の座標を取得し、Paint を呼び出すだけです。これは、ページング、スクロール、およびズームに左右されないドキュメント座標です。