可能重复:
RichTextBox 语法实时高亮--禁用重绘
我正在使用 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:对于那些感兴趣的人,RichTextBox 中重置 RTF 的解决方案?似乎可以解决问题。我会避免被投票为重复的那个(出于某种奇怪的原因),因为它会产生更多的图形问题。