У меня есть richTextBox, который я использую для подсветки синтаксиса.Это небольшое средство редактирования, поэтому я не написал пользовательскую подсветку синтаксиса - вместо этого я использую Regex
s и обновляю при обнаружении задержки ввода, используя обработчик событий для события Application.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()
.Чтобы преодолеть это, я нашел этот ответ на подобную дилемму Ханса Пассанта (Ганс Пассант никогда не подводил меня!):
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;
}
Однако, это дает мне странное поведение при обновлении;курсор умирает / зависает и показывает только странные полосы (см. изображение ниже).
Я явно не могу использовать альтернативную нить для обновления пользовательского интерфейса, так чтоЯ здесь не так делаю?
Спасибо за ваше время.