2012-08-10 206 views
4

我想实现一些以编程方式更改文本背景时提供了文档行的东西(与文本块选择看起来非常相似的东西)将此用于我设计的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有变化,而我正在查看该行,它不会突出更新的行,直到我滚动到文档的另一部分(隐藏更新的行) ,然后回到更新后的行。

另外,如何让行号从零开始?

回答

2

我找到了答案

TxtEditCodeViewer.TextArea.TextView.Redraw(); 
3

既然是他们的创作,我就偷看了SharpDevelop的来源以及他们是如何做到的。

他们定义了书签类型(BreakpointBookmark)并将书签添加到该行。 书签本身设置CreateMarker方法中的行的颜色。奇怪的是,在SharpDevelop中不能配置断点的颜色。

希望它有帮助。

protected override ITextMarker CreateMarker(ITextMarkerService markerService) 
    { 
     IDocumentLine line = this.Document.GetLine(this.LineNumber); 
     ITextMarker marker = markerService.Create(line.Offset, line.Length); 
     marker.BackgroundColor = Color.FromRgb(180, 38, 38); 
     marker.ForegroundColor = Colors.White; 
     return marker; 
    } 
+1

欣赏的答案。然而,在看看sharpdevelop如何处理这个问题之后,我认为不得不添加大量的类,接口来对代码进行实质性的改变,以实现看似简单的功能,这听起来不太可行。 – l46kok 2012-08-17 04:19:21

+0

在内心深处,SharpDevelop和你所做的一样。它创建断点作为TextSegments的书签标记。在TextMarkerService.ColorizeLine中,它可以找到它自己的标记(分段)并着色整行。你需要创建一个类MyMarker:TextSegment并将其保存在一个类型的变量中。 TextSegmentCollection 。在ColorizeLine中,从TextMarkerService.ColorizeLine复制并完成。 – edokan 2012-08-17 07:48:26

+0

对于行号,您必须编辑LineNumberMargin.OnRender并构建AvalonEdit。 – edokan 2012-08-17 07:53:14

0

这不是一个重复的this question

但是,您应该在编辑器上调用InvalidateArrange()或在每个更改的视觉上调用InvalidateVisual()

+0

我称之为。没有运气。更具体地说: TxtEditCodeViewer.TextArea.TextView.InvalidateVisual(); TxtEditCodeViewer.TextArea.TextView.InvalidateArrange(); TxtEditCodeViewer.TextArea.TextView.InvalidateMeasure(); – l46kok 2012-08-20 00:55:43

相关问题