RichTextBox中的实时语法高亮显示

时间:2011-09-16 17:51:42

标签: c# .net richtextbox syntax-highlighting

我目前正在开发一个非常简单的应用程序,在RichTextBox中使用非常基本的语法高亮显示。

它几乎没用。我正在做的是:

  • 如果一个或多个匹配,请查找预定义正则表达式的列表。
  • 选择匹配,将正确的样式应用于选择。
  • 然后将光标替换为最初的位置。

每个KeyUp事件都会触发此方法。它会造成很多闪烁。

所以我的问题是:我怎么能巧妙地突出显示我输入的文字而没有任何闪烁?这个编辑器永远不会包含数千行文本,可能大约有一百行,所以我还不需要任何非常优化的解决方案。

我尝试了其他帖子中提出的一些解决方案,但没有任何有趣的工作。而且我不想使用另一个库中的另一个组件 - 我想自己做这个用于学习目的。

2 个答案:

答案 0 :(得分:2)

我这样做的方法是等待直到键入停止,然后进行一次突出显示。 这是基本逻辑:

  • 使用每个keyup(或testchange等),设置“上次更改”时间,并排队后台任务(QueueUserWorkItem

  • 在后台线程的WaitCallback中,通过System.Threading.Thread.Sleep()等待750毫秒。睡眠结束后,检查“上次更改”时间。它不到750ms之前?如果是这样,用户仍在打字,所以,......无事可做。退出方法。

  • 如果上次更改时间超过750毫秒,则用户已停止输入。换句话说,在过去750毫秒的实时中没有发生任何变化。所以,突出显示。请记住,您需要在UI线程上进行UI更新。这意味着在应用格式之前,检查WinForms应用中的this.InvokeRequired或WPF中的this.Dispatcher.CheckAccess()

答案 1 :(得分:0)

我决定尝试一下,它的效果令人惊讶!

我一次突出显示一行。因此,当keyUp被触发时,我只解析所选行。所以没有闪烁!

在创业时我创建了一个HighlightLines()方法,循环遍历这些方法并调用我的HighlightLine(lineIndex)方法。

我会尝试将我的解决方案与Cheeso混合使用,我猜它会让一些很棒的东西!

由于