【问题标题】:Real time syntax highlighting in a RichTextBoxRichTextBox 中的实时语法高亮显示
【发布时间】:2011-09-17 02:09:32
【问题描述】:

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

它几乎可以正常工作。我正在做的是:

  • 如果有一个或多个匹配项,则查找预定义正则表达式列表。
  • 选择匹配项,将正确的样式应用于所选内容。
  • 然后将光标替换到原来的位置。

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

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

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

【问题讨论】:

  • 您是否尝试过使用 RenderTargetBitmap 制作它的副本,将其副本放在可视化树中的相同位置,将其从可视化树中删除,进行操作,将其放回可视化树,然后删除副本?

标签: c# .net richtextbox syntax-highlighting


【解决方案1】:

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

  • 对于每个 keyup(或 testchange 等),设置“最后一次更改”时间,并将后台任务排队 (QueueUserWorkItem)

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

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

【讨论】:

    【解决方案2】:

    我决定尝试一下,效果非常好!

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

    在启动时,我创建了一个 HighlightLines() 方法,该方法循环遍历线条并调用我的 HighlightLine(lineIndex) 方法。

    我会尝试将我的解决方案与 Cheeso's 混合,我想它会做出一些很棒的东西!

    谢谢

    【讨论】:

    • 如果您没有在文档末尾输入内容,这不会导致问题。例如,如果在第 5 行添加 30 个单词,那么接下来的 90 行会发生什么?
    • @Tipx :我的编辑器不是代码编辑器,而只是一个简单的指令编辑器,有这么多行指令,所以我对这个解决方案很安全。但我必须承认,对于任何代码编辑器,它都不能真正解决我的问题:P
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2013-08-13
    • 2011-08-24
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多