Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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
C# RichTextBox BeginUpdate()EndUpdate()扩展方法不起作用_C#_.net_Extension Methods_Richtextbox - Fatal编程技术网

C# RichTextBox BeginUpdate()EndUpdate()扩展方法不起作用

C# RichTextBox BeginUpdate()EndUpdate()扩展方法不起作用,c#,.net,extension-methods,richtextbox,C#,.net,Extension Methods,Richtextbox,我有一个richTextBox,用于执行一些语法高亮显示。这是一个小的编辑工具,因此我没有编写自定义语法荧光笔-而是使用Regexs,并在检测到输入延迟时使用应用程序的事件处理程序进行更新。Idle事件: Application.Idle += new EventHandler(Application_Idle); 在事件处理程序中,我检查文本框处于非活动状态的时间: private void Application_Idle(object sender, EventArgs e) {

我有一个richTextBox,用于执行一些语法高亮显示。这是一个小的编辑工具,因此我没有编写自定义语法荧光笔-而是使用
Regex
s,并在检测到输入延迟时使用
应用程序的事件处理程序进行更新。Idle
事件:

Application.Idle += new EventHandler(Application_Idle);
在事件处理程序中,我检查文本框处于非活动状态的时间:

private void Application_Idle(object sender, EventArgs e)
{
    // Get time since last syntax update.
    double timeRtb1 = DateTime.Now.Subtract(_lastChangeRtb1).TotalMilliseconds;

   // If required highlight syntax.
   if (timeRtb1 > MINIMUM_UPDATE_DELAY)
   {
       HighlightSyntax(ref richTextBox1);
       _lastChangeRtb1 = DateTime.MaxValue;
   }
}
但是,即使是相对较小的突出显示,
RichTextBox
也会大量闪烁,并且它没有
RichTextBox.BeginUpdate()/EndUpdate()
方法。为了克服这一点,我发现(汉斯·帕桑从未让我失望过!):

然而,这给了我一个奇怪的行为更新;光标消失/冻结,只显示奇怪的条纹(见下图)

很明显,我不能使用其他线程来更新UI,那么我在这里做错了什么


谢谢您的时间。

尝试修改
EndUpdate
以在之后也调用Invalidate。控件不知道它需要进行一些更新,因此您需要告诉它:

public void EndUpdate() 
{ 
  SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);  
  this.Invalidate();
}

那是薄荷糖!工作得很有魅力。。。一个小问题,您如何了解扩展方法及其微妙之处<代码>发送消息(this.Handle,WM_SETREDRAW,(IntPtr)1,IntPtr.Zero)不完全是标准的C!?还是真的?@Killercam
SendMessage
和扩展是两码事
SendMessage
正在调用windows API函数。有关扩展,请参阅。感谢您的回复。我意识到两者是不同的。感谢您的链接和帮助,非常感谢。
public void EndUpdate() 
{ 
  SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);  
  this.Invalidate();
}