我想实现一些以编程方式更改文本背景时提供了文档行的东西(与文本块选择看起来非常相似的东西)将此用于我设计的IDE的调试断点)。我不想使用选择,因为它会导致文本框滚动。Avalonedit如何以编程方式更改文本的背景
我想我需要使用DocumentColorizingTransformer,但我不是100%确定如何去做这件事。
public class ColorizeAvalonEdit : ICSharpCode.AvalonEdit.Rendering.DocumentColorizingTransformer
{
protected override void ColorizeLine(ICSharpCode.AvalonEdit.Document.DocumentLine line)
{
int lineStartOffset = line.Offset;
string text = CurrentContext.Document.GetText(line);
int start = 0;
int index;
if (line.LineNumber == LogicSimViewCodeWPFCtrl.currentLine)
{
while ((index = text.IndexOf(text, start)) >= 0)
{
base.ChangeLinePart(
lineStartOffset + index, // startOffset
lineStartOffset + index + text.Length, // endOffset
(VisualLineElement element) =>
{
element.TextRunProperties.SetBackgroundBrush(Brushes.Red);
});
start = index + 1; // search for next occurrence
}
}
}
}
currentLine是将突出显示的部分。
上面的代码确实工作正常..唯一的问题是,如果currentLine有变化,而我正在查看该行,它不会突出更新的行,直到我滚动到文档的另一部分(隐藏更新的行) ,然后回到更新后的行。
另外,如何让行号从零开始?
欣赏的答案。然而,在看看sharpdevelop如何处理这个问题之后,我认为不得不添加大量的类,接口来对代码进行实质性的改变,以实现看似简单的功能,这听起来不太可行。 – l46kok 2012-08-17 04:19:21
在内心深处,SharpDevelop和你所做的一样。它创建断点作为TextSegments的书签标记。在TextMarkerService.ColorizeLine中,它可以找到它自己的标记(分段)并着色整行。你需要创建一个类MyMarker:TextSegment并将其保存在一个类型的变量中。 TextSegmentCollection。在ColorizeLine中,从TextMarkerService.ColorizeLine复制并完成。 –
edokan
2012-08-17 07:48:26
对于行号,您必须编辑LineNumberMargin.OnRender并构建AvalonEdit。 – edokan 2012-08-17 07:53:14