【问题标题】:Clear SelectionBackColor from text in RichTextBox [duplicate]从 RichTextBox 中的文本中清除 SelectionBackColor [重复]
【发布时间】:2012-08-21 01:27:09
【问题描述】:

可能重复:
RichTextBox syntax highlighting in real time--Disabling the repaint

我正在使用 RichTextBox 控件来查找和更改某些单词的 SelectionBackColor 属性。文字不是固定的,所以基本上有不同BackColor的文字会有所不同。

我已经尝试了两种方法来清除之前文本中的背景颜色,然后再将其应用于新单词:

  • 选择所有文本并将 SelectionBackColor 设置为 Controls BackColor。
  • 将文本保存为字符串,然后将其放回 RichTextBox 以清除其格式。

虽然这两种方法都有效,但当控件中有大量文本时会出现问题。对于第一种方法,所有文本都被选中(你可以注意到它几毫秒)变得更加清晰,这变得很烦人,因为这发生在 TextChanges 事件中,所以基本上每个被删除/添加的字母都会触发这个。至于第二种方法,它不像第一种那么明显,但由于文本被删除然后插入回来,滚动变得有点奇怪,因为即使在使用 .ScrollToCaret() 之后,滚动条也不完全是它之前的样子SelectionBackColor 清除。

感觉应该有更好的方法来清除现有的 SelectionBackColor 而不会出现所有这些问题。特别是在这种情况下,因为它必须在 TextChanged 事件中进行清理。

等待您的想法。提前致谢。

编辑:您可以在下面看到我在上面提到的第一个示例中使用的方法(全选)。

private void ClearSelection(RichTextBox rtb)
{
    if (rtb.Text.Length > 0)
    {
        int currentIndex = rtb.SelectionStart;
        rtb.SelectAll();
        rtb.SelectionBackColor = Color.White;
        rtb.SelectionLength = 0;
        rtb.SelectionStart = currentIndex;
    }
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    if (!_working)
    {
        ClearSelection(richTextBox1);
    }
}

_working bool 只是为了确保当程序更改某些单词的颜色时不会触发该方法,以便仅在用户更改文本时触发它。

Edit2: 对于那些感兴趣的人,Reset RTF in RichTextBox? 的解决方案似乎可以解决问题。我会避免被选为重复的那个(出于某种奇怪的原因),因为它会产生更多的图形问题。

【问题讨论】:

  • 上述方法会导致调用 EndUpdate() 后并非所有文本都实际出现的问题。字符确实会打印在控件上,但在您选择它们​​之前它们与背景颜色相同,而且阁楼的行为也很奇怪。示例:进行更改并调用 EndUpdate() i.imgur.com/p3Ogy.jpg |选择该文本后i.imgur.com/1ar4T.jpg
  • 用一些代码更新了第一篇文章。

标签: winforms richtextbox textselection backcolor


【解决方案1】:

您是否尝试过使用双缓冲?可能是这样的:

richTextBox1.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);

【讨论】:

  • 是的,我已经在使用双缓冲了。但可悲的是,它并没有太大的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2019-11-18
  • 2019-09-06
相关资源
最近更新 更多