RichTextBox for WPF
ペインタ
RichTextBox for WPF の使い方 > ペインタ

ペインタは、C1RichTextBox がテキストを表示するキャンバスと同じキャンバスに UIElement を表示することで、C1RichTextBox 拡張します。これは、スタイルのオーバーライドより汎用的な拡張を可能にしますが、使い方は多少難しくなります。C1RichTextBox では、選択範囲を表示するためにペインタを内部的に使用しています。

ペインタは、IRichTextPainter インタフェースの実装です。このインタフェースには Paint と PaintInline の2つのメソッドがあり、それぞれ C1RichTextBox の描画パスの異なる段階で呼び出されます。各メソッドは、描画されるビューポートのチェックに使用される C1PaintingContext オブジェクトを受け取り、カスタム UIElement を描画するためのメソッドを持ちます。

Paint は、画面全体が再描画されるたびに呼び出されます。このメソッドが呼び出されるたびに、Paint を呼び出すことによってすべての UIElements を描画する必要があります。そうしないと、要素が削除されます。毎回同じ UIElement を渡す方が、ビジュアルツリーから削除されないので効率的です。

PaintInline は、描画される C1Line ごとに呼び出されます。このメソッドを使用すると、カスタム UIElement を描画するレイヤを細かく制御できます。たとえば、要素をテキストの背景の上で、かつテキスト自体の下に描画することができます。ルールは、Paint と同じです。PaintInline を呼び出して、すべての UIElement を描画する必要があります。そうしないと、要素が削除されます。

Annotations サンプルは、ペインタを使用して付箋を表示します。実装は次のとおりです。

コードのコピー
Class StickyPainter
   Implements IRichTextPainter
   Private _stickies As List(Of StickyNote)
   Public Sub New(stickies As List(Of StickyNote))
       _stickies = stickies
   End Sub
   Public Sub Paint(context As C1PaintingContext)
       For Each sticky As var In _stickies
           Dim rect = context.ViewManager.GetRectFromPosition(sticky.Range.Start)
           context.Paint(Math.Round(rect.X), Math.Round(rect.Bottom), False, sticky)
       Next
   End Sub
   Public Sub PaintInline(context As C1PaintingContext, line As C1Line)
   End Sub
   Public Event PainterChanged As EventHandler(Of RichTextPainterChangeEventArgs)
End Class
コードのコピー
class StickyPainter : IRichTextPainter
{
   List<StickyNote> _stickies;
   public StickyPainter(List<StickyNote> stickies)
   {
       _stickies = stickies;
   }
   public void Paint(C1PaintingContext context)
   {
       foreach (var sticky in _stickies)
       {
          var rect = context.ViewManager.GetRectFromPosition(sticky.Range.Start);
           context.Paint(Math.Round(rect.X), Math.Round(rect.Bottom), false, sticky);
       }
   }
   public void PaintInline(C1PaintingContext context, C1Line line)
   {
   }
   public event EventHandler<RichTextPainterChangeEventArgs> PainterChanged;
}

StickyPainter は、Paint メソッドのみを使用します。このメソッドは、各付箋に対してドキュメント内の座標を取得し、Paint を呼び出すだけです。これは、ページング、スクロール、およびズームに左右されないドキュメント座標です。