2

我想在双击鼠标时突出显示所选单词的所有出现。这个问题在 AvalonEdit 中突出显示所有出现的选定单词确实回答了如何使用 Document Colorizer 执行此操作,但我不确定如何将单词传入。另外,如何通过鼠标双击触发重新着色?

4

1 回答 1

3

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