Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 清除RichTextBox中文本的SelectionBackColor_Winforms_Richtextbox_Textselection_Backcolor - Fatal编程技术网

Winforms 清除RichTextBox中文本的SelectionBackColor

Winforms 清除RichTextBox中文本的SelectionBackColor,winforms,richtextbox,textselection,backcolor,Winforms,Richtextbox,Textselection,Backcolor,可能重复: 我正在使用RichTextBox控件查找和更改某些单词的SelectionBackColor属性。单词不是固定的,所以基本上不同背景颜色的文本是不同的 我已经尝试过两种方法来清除前一篇文章的背景色,然后再将其应用到生词中: 选择所有文本并将SelectionBackColor设置为控件的BackColor 将文本保存为字符串,然后将其放回RichTextBox以清除其格式 虽然这两种方法都有效,但当控件中有大量文本时,会出现一个问题。对于第一种方法,所有文本都被选中(你可以注意

可能重复:

我正在使用RichTextBox控件查找和更改某些单词的SelectionBackColor属性。单词不是固定的,所以基本上不同背景颜色的文本是不同的

我已经尝试过两种方法来清除前一篇文章的背景色,然后再将其应用到生词中:

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

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

等待你的想法。提前谢谢

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

工作bool只是为了确保当程序更改某些单词的颜色时不会触发该方法,因此只有当用户更改文本时才会触发该方法


Edit2:对于那些感兴趣的人来说,位于的解决方案似乎起到了作用。我会避免被选为重复的(出于一些奇怪的原因),因为它会产生更多的图形问题。

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

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

是的,我已经在使用双缓冲。但遗憾的是,它并没有带来太大的区别。上面的方法会导致一些问题,即在调用EndUpdate()后,并非所有文本都会出现。字符确实会打印在控件上,但在您选择它们之前,它们的颜色与背景颜色相同,而且garret的行为也很怪异。示例:进行更改并调用EndUpdate()|选择该文本后,使用一些代码更新了第一篇文章。
richTextBox1.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);