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