s métodos de extensão @RichTextBox BeginUpdate () EndUpdate () não estão funcionando
Eu tenho um richTextBox que estou usando para executar algum destaque de sintaxe. Este é um pequeno recurso de edição, por isso não escrevi um marcador de sintaxe personalizado. Em vez disso, estou usandoRegex
s e atualização após a detecção de um atraso de entrada usando um manipulador de eventos para oApplication.Idle
evento:
Application.Idle += new EventHandler(Application_Idle);
no manipulador de eventos, verifico o tempo em que a caixa de texto ficou inativa:
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;
}
}
Mas mesmo para destaques relativamente pequenos, oRichTextBox
pisca fortemente e não temrichTextBox.BeginUpdate()/EndUpdate()
métodos. Para superar isso, encontreiesta resposta a um dilema semelhante de Hans Passant (Hans Passant nunca me decepcionou!):
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MyRichTextBox : RichTextBox
{
public void BeginUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
}
public void EndUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int WM_SETREDRAW = 0x0b;
}
No entanto, isso me dá um comportamento estranho após uma atualização; o cursor morre / congela e não mostra nada além de listras de aparência estranha (veja a imagem abaixo
Eu claramente não posso usar um segmento alternativo para atualizar a interface do usuário, então o que estou fazendo de errado aqu
Obrigado pelo seu tempo