Ho un richTextBox che sto usando per eseguire l'evidenziazione della sintassi. Questa è una piccola struttura di modifica in modo da non ho scritto un evidenziatore di sintassi personalizzato - invece sto usando Regex
s e l'aggiornamento al rilevamento di un ritardo di ingresso utilizzando un gestore di eventi per il Application.Idle
evento:RichTextBox BeginUpdate() EndUpdate() Metodi di estensione non funzionanti
Application.Idle += new EventHandler(Application_Idle);
in caso handler ho controllare il tempo la casella di testo è stato inattivo:
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;
}
}
Ma anche per relativamente piccole evidenzia l'RichTextBox
sfarfalla pesantemente e non ha richTextBox.BeginUpdate()/EndUpdate()
metodi. Per ovviare a questo ho trovato this answer to a similar dilemma by Hans Passant (Hans Passant è mai let me down!):
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;
}
Tuttavia, questo mi dà strano comportamento su di un aggiornamento; il cursore muore/si blocca e mostra nient'altro che strane strisce (vedi immagine sotto).
io chiaramente non posso usare un thread alternativa per aggiornare l'interfaccia utente, così che cosa sto facendo male qui?
Grazie per il vostro tempo.
Che è nuovo! Ha funzionato come un incantesimo ... Una piccola domanda, come apprendi i Metodi di estensione e le loro sottigliezze? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);' non è esattamente lo standard C# !? O è? – MoonKnight
@Killercam 'SendMessage' e le estensioni sono due cose diverse. 'SendMessage' sta chiamando una funzione API di Windows. Per le estensioni, vedere [Metodi di estensione (C# Programming Guide)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech
Grazie per la risposta. Mi rendo conto che i due sono diversi. Grazie per il link e il tuo aiuto, è molto apprezzato. – MoonKnight