2011-02-17 29 views
4

令人難以置信的真棒AvalonEdit WPF TextEditor控件似乎缺乏一個重要的功能,或者至少我不明白。 給定偏移量和長度,使用HighlightColor高亮顯示TextDocument中的該部分。很簡單,對吧?AvalonEdit WPF TextEditor(SharpDevelop):如何突出顯示特定範圍的文本?

不是。我有RTFM,關於「Syntax Highlighting」的文檔讓我更困惑。 Someone else asked the same question in the SharpDevelop forums,恐怕我無法理解赫爾格倫瓦爾德的答案。

這裏是我的嘗試,使用DocumentHighlighter類(當然它不工作):

textEditor1.Text = "1234567890"; 

    HighlightingColor c = new HighlightingColor() { FontWeight = FontWeights.ExtraBold }; 

    DocumentHighlighter dh = new DocumentHighlighter(textEditor1.Document, new HighlightingRuleSet()); 
    HighlightedLine hl = dh.HighlightLine(1); 

    hl.Sections.Add(new HighlightedSection() { Color = c, Offset = 1, Length = 3 }); 

謝謝你的幫助!

回答

5

你在this article看到這一點 - 它似乎正是你要求:

public class ColorizeAvalonEdit : DocumentColorizingTransformer 
{ 
protected override void ColorizeLine(DocumentLine line) 
{ 
    int lineStartOffset = line.Offset; 
    string text = CurrentContext.Document.GetText(line); 
    int start = 0; 
    int index; 
    while ((index = text.IndexOf("AvalonEdit", start)) >= 0) { 
     base.ChangeLinePart(
      lineStartOffset + index, // startOffset 
      lineStartOffset + index + 10, // endOffset 
      (VisualLineElement element) => { 
       // This lambda gets called once for every VisualLineElement 
       // between the specified offsets. 
       Typeface tf = element.TextRunProperties.Typeface; 
       // Replace the typeface with a modified version of 
       // the same typeface 
       element.TextRunProperties.SetTypeface(new Typeface(
        tf.FontFamily, 
        FontStyles.Italic, 
        FontWeights.Bold, 
        tf.Stretch 
       )); 
      }); 
     start = index + 1; // search for next occurrence 
} } } 

它強調字AvalonEdit大膽。

+0

不應該`endOffset` =`lineStartOffset + index +「AvalonEdit」.Length`?你在哪裏添加整個字符串的長度,而不是任意偏移量爲10. – 2016-10-22 23:36:12

7

一些背景信息: AvalonEdit是一個代碼編輯器,而不是一個富文本編輯器。沒有「突出顯示文檔的一部分」這樣的東西 - 文檔只存儲純文本。

突出顯示的是計算按需,只針對當前視線。如果你想自定義突出顯示,你需要在突出顯示的計算中增加一個步驟 - 這就是mzabsky發佈的例子中的ColorizeAvalonEdit類正在做的事情。

+0

謝謝丹尼爾。我現在對AvalonEdit有所瞭解,並且已經創建了一個可行的解決方案。 – 2011-02-18 03:21:00

4

您需要創建一個自定義ColorizingTransformer來做到這一點。上面的例子實際上突出了一個特定的詞。儘管如此,您可以稍微改變它以着色或突出顯示一部分。

我用的Avalon文本編輯我Console+項目(這是一個非常原始的階段,此刻)

public class OffsetColorizer : DocumentColorizingTransformer 
{ 
    public int StartOffset { get; set; } 
    public int EndOffset { get; set; } 

    protected override void ColorizeLine(DocumentLine line) 
    { 
     if (line.Length == 0) 
      return; 

     if (line.Offset < StartOffset || line.Offset > EndOffset) 
      return; 

     int start = line.Offset > StartOffset ? line.Offset : StartOffset; 
     int end = EndOffset > line.EndOffset ? line.EndOffset : EndOffset; 

     ChangeLinePart(start, end, element => element.TextRunProperties.SetForegroundBrush(Brushes.Red)); 
    } 
} 

而且你可以將它添加到LineTransformers收集colorizer添加到編輯器。

tbxConsole.TextArea.TextView.LineTransformers.Add(_offsetColorizer); 
1

我知道這是一個很老的問題,但我想我會分享我的解決方案。我不確定這個解決方案是否已經實現到AvalonEdit中,因爲這個問題最初得到了解答,但是我發現OffsetColorizer類實際上並沒有選擇這一行:它只是改變了行的背景色。

我的解決方案如下:

textEditor.SelectionStart = offset; 

textEditor.SelectionLength = length; 

然而,這可以進一步像這樣進行擴展:

public void SelectText(int offset, int length) 
{ 
    //Get the line number based off the offset. 
    var line = textEditor.Document.GetLineByOffset(offset); 
    var lineNumber = line.LineNumber; 

    //Select the text. 
    textEditor.SelectionStart = offset; 
    textEditor.SelectionLength = length; 

    //Scroll the textEditor to the selected line. 
    var visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(lineNumber); 
    textEditor.ScrollToVerticalOffset(visualTop); 
} 

我發現,這個解決方案工作得更好的是,而不是僅僅着色線,它實際上選擇它:意味着它可以使用Ctrl + C複製。

我希望這可以幫助未來的人。

相關問題