可能重复:
RichTextBox syntax highlighting in real time--Disabling the repaint
我正在使用RichTextBox控件来查找和更改某些单词的SelectionBackColor属性。单词不固定,所以基本上具有不同BackColor的文本会有所不同。
在将新单词应用到新单词之前,我已经尝试过两种清除前一文本BackColor的方法:
虽然两种方法都有效,但是当控件中有大量文本时会出现问题。对于第一种方法,更清楚的是所有文本都被选中(你可以注意它几毫秒),这会变得烦人,因为这发生在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?处的解决方案似乎可以解决问题。我会避免被选为重复的那个(由于一些奇怪的原因),因为它会产生更多的图形问题。
答案 0 :(得分:0)
您是否尝试过使用双缓冲?也许是这样的:
richTextBox1.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);