2

マウスをダブルクリックしたときに、選択した単語のすべての出現箇所を強調表示したい。この質問AvalonEdit で選択された単語のすべての出現箇所を強調表示すると、ドキュメント カラライザーでそれを行う方法に答えますが、単語を渡す方法がわかりません。

4

1 に答える 1

3

背景色を変更するだけで単語を強調したい場合は、簡単な解決策が 1 つあります。IBackgroundRenderer

強調表示する必要があるドキュメントの部分を保存するには、TextSegmentCollection<T>. このコレクションにはインスタンスが格納され、メソッドの実装TextSegmentで使用できます。IBackgroundRenderer.Draw

Layerプロパティは、 がレンダリングされるレイヤーを返す必要がありますIBackgroundRenderer。これは単にKnownLayer.Selection、選択範囲の背後にレンダリングするためのものです。

メソッドは次のDrawように実装できます。

if (!textView.VisualLinesValid)
    return;

var visualLines = textView.VisualLines;
if (visualLines.Count == 0)
    return;

int viewStart = visualLines.First().FirstDocumentLine.Offset;
int viewEnd = visualLines.Last().LastDocumentLine.EndOffset;

foreach (TextSegment result in currentResults.FindOverlappingSegments(viewStart, viewEnd - viewStart)) 
    BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();
    geoBuilder.AlignToMiddleOfPixels = true;
    geoBuilder.CornerRadius = 3;
    geoBuilder.AddSegment(textView, result);
    Geometry geometry = geoBuilder.CreateGeometry();
    if (geometry != null) {
        drawingContext.DrawGeometry(markerBrush, markerPen, geometry);
    }
}

簡単な説明: まず、VisualLinesが有効であるかどうか、および存在するかどうかを確認する必要があります。そうでない場合は、何もする必要がないので、終了します。

次に、最初に表示されるドキュメント行の開始オフセットと、最後に表示されるドキュメント行の終了オフセットを使用して、表示範囲を計算できます。現在表示されているもののみを処理するため、これによりレンダリング プロセスが高速化されます。

FindOverlappingSegments指定された範囲と重複するすべてのセグメントのリストを返します。

次にBackgroundGeometryBuilder、ヘルパー クラスである を使用して、ハイライト用の見栄えの良いジオメトリを作成します。これは、AvalonEdit で現在選択されているテキストにも使用されます。

それをTextEditor使用に追加するには:textEditor.TextArea.TextView.BackgroundRenderers.Add(renderer);

結果をプロパティとして公開する場合は、次を使用できます。renderer.Results.Add(result);

画面を更新するtextEditor.TextArea.TextView.InvalidateLayer(KnownLayer.Selection);には、自動的に行われない場合に使用できます。

于 2013-09-11T15:48:34.163 に答える