RichTextBox中的实时语法高亮显示

本文关键字:高亮 显示 语法 实时 RichTextBox | 更新日期: 2023-09-27 18:08:54

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

它几乎工作得很好。我要做的是:

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

这个方法在每个KeyUp事件上被触发。它会产生很多闪烁。

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

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

RichTextBox中的实时语法高亮显示

我的方法是等到输入停止,然后做一次高亮显示。这是基本逻辑:

  • 每次keyup(或testchange等),设置"最后更改"时间,并排队后台任务(QueueUserWorkItem)

  • WaitCallback为后台线程,通过System.Threading.Thread.Sleep()等待750ms。当睡眠结束时,检查"最后一次更改"时间。是小于750毫秒之前吗?如果是,用户仍在输入,所以,…无事可做。只需退出该方法。

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

我决定尝试一些东西,它非常有效!

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

在启动时,我创建了HighlightLines()方法,它循环遍历行并调用HighlightLine(lineIndex)方法

我会试着把我的溶液和芝士的混合在一起,我想它会做出很棒的东西!

谢谢