Mam richTextBox używam do wykonania podświetlania składni. Jest to niewielki zakład edycji więc nie pisałem wyróżnienia niestandardowy składni - zamiast Używam Regex
s i aktualizowanie po wykryciu opóźnienia wejściowego przy użyciu programu obsługi zdarzeń dla zdarzenia Application.Idle
:RichTextBox BeginUpdate() EndUpdate() Metody rozszerzeń nie działa
Application.Idle += new EventHandler(Application_Idle);
w przypadku Wózek sprawdzić po raz pole tekst został nieaktywna:
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;
}
}
Ale nawet dla stosunkowo małych Podkreśla RichTextBox
migocze mocno i nie ma richTextBox.BeginUpdate()/EndUpdate()
metod. Aby temu zaradzić znalazłem this answer to a similar dilemma by Hans Passant (Hans Passant nigdy mnie nie zawiódł!):
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;
}
Jednak to daje mi dziwne zachowanie podczas aktualizacji; kursor umiera/zamarza i pokazuje tylko dziwnie wyglądające paski (patrz zdjęcie poniżej).
I oczywiście nie można użyć alternatywnego wątek zaktualizować UI, więc to, co robię źle tutaj?
Dzięki za poświęcony czas.
To jest mięta! Pracowałam jak czar ... Jedno małe pytanie, jak nauczysz się o metodach rozszerzania i ich subtelnościach? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);' nie jest dokładnie standardowym C# !? Albo to jest? – MoonKnight
@Killercam 'SendMessage' i rozszerzenia to dwie różne rzeczy. 'SendMessage' wywołuje funkcję Windows API. W przypadku rozszerzeń zobacz [Metody rozszerzeń (C# Programming Guide)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech
Dzięki za odpowiedź. Zdaję sobie sprawę, że te dwie są inne. Dzięki za link i pomoc, jest to najbardziej cenione. – MoonKnight