突出显示avalonedit中出现的所有单词

时间:2013-08-15 05:47:23

标签: avalonedit

我希望在双击鼠标时突出显示所选单词的所有匹配项。这个问题Highlight all occurrences of selected word in AvalonEdit确实回答了如何使用Document Colorizer,但我不知道如何传入这个词。另外,如何通过鼠标双击来触发重新着色?

1 个答案:

答案 0 :(得分:2)

如果您只想通过更改背景颜色来突出显示单词,可以使用一个简单的解决方案:使用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);