如何在Winforms RichTextBox中实现基本语法高亮?

时间:2011-05-12 18:03:59

标签: c# .net regex winforms richtextbox

我有一个我要在RichTextBox控件中突出显示的单词列表,我知道如何执行此操作但是解析所有内容以分隔单词时会遇到问题。

如何将一行或整个文本解析为单独的单词,然后对其进行枚举并使用RichTextBox.Select()方法对其进行着色。

这是一个好方法吗?有更好/更快的方式吗?

5 个答案:

答案 0 :(得分:2)

您可以使用Avalon Edit代替RichTextBox,它是免费的。它是#develop中使用的编辑器。我想你可能不得不从#develop源代码下载程序集,但这是值得的。

答案 1 :(得分:2)

使用RichTextBox.Find(String,Int32,Int32,RichTextBoxFinds)方法在控件中查找字符串。然后,您可以通过将“开始”点更改为当前单词之后的点来进行迭代。

不确定这个方案的表现但它会起作用。

http://msdn.microsoft.com/en-us/library/yab8wkhy.aspx

答案 2 :(得分:1)

尝试string.Split方法。它返回由分隔符分割的字符串数组。

此外,您可能会发现这些链接很有用:link1 link2

甚至更多:类似应用程序的example很好

答案 3 :(得分:1)

您可以使用RichTextBox.Find方法在RichTextBox中查找字符串。此方法返回找到的文本的位置。该链接中的代码示例将突出显示该文本。

答案 4 :(得分:1)

可能不是最快的方式,但它有效 首先致电ClearHighLighting以清除之前,然后致电SetHighLighting

private readonly List<HighLight> _highLights = new List<HighLight>();
private class HighLight
{
  public int Start { get; set; }
  public int End { get; set; }
}

public void SetHighLighting(string text)
{

    // Clear Previous HighLighting
    ClearHighLighting();

    if (text.Length > 0)
    {
        int startPosition = 0;
        int foundPosition = 0;            
        while (foundPosition > -1)
        {
            foundPosition = richTextBox1.Find(text, startPosition, RichTextBoxFinds.None);
            if (foundPosition >= 0)
            {
                richTextBox1.SelectionBackColor = Color.Yellow;
                int endindex = text.Length;
                richTextBox1.Select(foundPosition, endindex);                        
                startPosition = foundPosition + endindex;                        
                _highLights.Add(new HighLight() { Start = foundPosition, End = endindex });
            }
        }
    }
}

public void ClearHighLighting()
{
    foreach (var highLight in  _highLights)
    {
        richTextBox1.SelectionBackColor = richTextBox1.BackColor;
        richTextBox1.Select(highLight.Start, highLight.End);                        
    }
    _highLights.Clear();
}