【问题标题】:Efficiently color coding the text in a RichTextBox有效地对 RichTextBox 中的文本进行颜色编码
【发布时间】:2017-04-25 23:08:11
【问题描述】:

我有一个 RichTextBox,用户可以按照以下规则在其中输入一些带有颜色代码的文本。

  1. { } ( ) | . (dot)这些字符应该是红色的。
  2. [A-Z] [a-z] [0-9] 下划线和连字符。这些应该是深灰色的。
  3. 其他一切都应该是蓝色的。

现在,当盒子的内容发生变化时,我有这个事件的代码。 只要检测到文本框内容发生变化,就会调用此方法。

public void colorCode() {
    for (int i = 0 ; i < rtb.Text.Length ; i++) {
         rtb.Select(i,1); //select a single character
         char ch = rtb.Text[i];
         if (ch == '{' || ch == '}' || 
             ch == '(' || ch == ')' ||
             ch == '.') 
             rtb.SelectionColor = Color.Red;
         else if (isAlphaNumeric(ch)) 
             rtb.SelectionColor = Color.DarkGrey;
         else
             rtb.SelectionColor = Color.Blue;
    }
}

正如您所见,当有数百个字符时,这可能会非常慢。我该如何改善这种情况。

【问题讨论】:

  • 您可以尝试对更新进行排队,而不是在每次更改后运行它们,请参阅this
  • @Sinatr 非常感谢您提供更详细的答案。
  • 也许你可以使用一个支持语法高亮的编辑器,比如AvalonEdit。在documentation 中,您可以找到how to define your own rules
  • 不确定它在这里是否有帮助,但您可以尝试我们在循环周围执行 supend/resumeLayout.. - 或仅每秒刷新一次。 -
  • 尝试使用FastColoredTextBox

标签: c# richtextbox


【解决方案1】:

您可能可以在 KeyUp 事件中执行此操作,因此您只查看更改的单个字符。不确定这是否会更快。

private void rtb_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{

    if (e.KeyCode == Keys.OemPeriod
         rtb.SelectionColor = Color.Red;
     ...
    }
}

【讨论】:

  • 无意冒犯,但这应该是评论而不是答案。我不会,但有人可能会否决这个答案。现在关于您的解决方案,我将如何确切知道更改发生的位置。它可能位于文本框中已有的内容之间。
  • 不确定我是否理解您关于更改发生位置的问题。 KeyUp 事件将有一个事件 arg 告诉您按下了哪个键,因此您可以在此时评估单个字符应该是什么颜色,而不是循环遍历所有先前输入的文本。 msdn.microsoft.com/en-us/library/…
  • 假设这是abcdef..(( 框内的文本,现在用户将光标放在字母c 旁边,然后按{。现在按照您的逻辑,我知道按下了哪个键,但我不知道在字符串中的哪个位置。
  • 位置无所谓,你只关心输入了什么字符。
  • 位置很重要,因为需要为角色赋予特定的颜色。查看我的代码rtb.SelectionColorrtb.select(position,length)
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 2014-03-11
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多