2012-02-23 16 views
5

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).

Odd Error Caused by RichTextBox Method Extension

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.

risposta

7

Provare a modificare EndUpdate per chiamare successivamente Invalidate. Il controllo non sa che è necessario fare qualche aggiornamento, quindi è necessario dirlo:

public void EndUpdate() 
{ 
    SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
    this.Invalidate(); 
} 
+0

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

+1

@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

+0

Grazie per la risposta. Mi rendo conto che i due sono diversi. Grazie per il link e il tuo aiuto, è molto apprezzato. – MoonKnight

Problemi correlati