我有这个功能:
private void clearRichtextBox()
{
richTextBox2.Clear();
foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
{
for (int i = 0; i < kvp.Value.Count(); i++)
{
richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine);
}
}
}
在它做Clear();
的地方,它看起来像 richTextBox 闪烁/闪烁几毫秒左右。有什么方法可以避免阻止它吗?
我最近遇到了类似的问题。 我选择的解决方案是将扩展方法添加到富文本框中。 我喜欢这种方法,因为它干净、包含且易于重复使用。
这使得暂停重绘就像
richtextbox.SuspendDrawing();
和恢复
richtextbox.ResumeDrawing()
public static class RichTextBoxExtensions
{
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int WM_SETREDRAW = 0x0b;
public static void SuspendDrawing(this System.Windows.Forms.RichTextBox richTextBox)
{
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
}
public static void ResumeDrawing(this System.Windows.Forms.RichTextBox richTextBox)
{
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
richTextBox.Invalidate();
}
}
来源: https://stackoverflow.com/a/487757/3442448
您无法避免 RichTextBox
的固有行为,即在文本更改时至少排队一次重绘,但在您提供的代码片段中,您可以设置带外准备文本,而不是调用 clear。这会将视觉活动更改量降至最低,而无需更改其正常操作。此外,您似乎希望使内容与键值集的视图保持一致。
在将文本应用于RichTextBox
之前,请使用StringBuilder
来组合文本,如果存在差异,则分配 Text
属性。如果 RichTextBox
的内容没有变化 ,它不会重绘所有内容,这是您看到的闪烁行为的来源。
private void clearRichtextBox()
{
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
{
for (int i = 0; i < kvp.Value.Count(); i++)
{
sb.AppendFormat("Url: {0} --- Localy KeyWord: {1}{2}", kvp.Key,kvp.Value[i],Environment.NewLine);
}
}
string viewString = sb.ToString();
if(viewString != richTextBox2.Text)
{
richTextBox2.Text = viewString;
}
}
这就是它的工作原理。您可以尝试在表单上启用双缓冲:
this.DoubleBuffered = true;
另一种方法是继承 RichTextBox 控件并使用 SetStyle()
重写其 New() 方法,以便为控件本身启用双缓冲。
如何使用此方法:
public class MyRichTextBox : RichTextBox {
protected override void New() {
base.New();
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
}
然后,您需要执行以下步骤:
- 关闭设计器窗口
- 打开设计器文件
- 您需要将
RichTextBox
替换为MyRichTextBox
两次,一个靠近声明它的文件顶部,另一个靠近初始化它的底部。 - 保存并重新打开设计器/测试
这也可能有所帮助:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/a6abf4e1-e502-4988-a239-a082afedf4a7
它使用 SendMessage 打开/关闭控件的重绘模式。
我还没有尝试过看看它是否也闪烁,但您可以将 RTB 的值设置为空字符串。
richTextBox2.Text = "";
foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
{
for (int i = 0; i < kvp.Value.Count(); i++)
{
richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine);
}
}