2011-02-07 12 views
5

Sto utilizzando il controllo RichTextBox per visualizzare i registri delle applicazioni. Sto aggiornando il controllo una volta al secondo con alcune chiamate del metodo RichTextBox :: AppendText. Ciò che è veramente fastidioso per me è che il cursore continua a scorrere fino all'ultima riga di testo. È molto scomodo quando l'utente ha bisogno di analizzare i log che sono all'inizio. Ho cercato soluzione seguente al mio problema:Disabilitazione automatica di RichTextBox

int pos = tb_logs.SelectionStart; 
tb_logs.AppendText("log message"); 
tb_logs.SelectionStart = pos; 

Questo non va al nocciolo del problema perché il controllo sia periodicamente redrawed che è molto fastidioso. C'è una soluzione più pulita?

+0

Suona un po 'strano perché andare fino alla fine dovrebbe essere fatto in modo esplicito da qualche parte. Sei sicuro che il codice non sta andando a impostare la selezione per la fine stessa? –

+0

No, solo AppendText ("testo"), AppendText ("\ t"), Appendtext ("\ n") – truthseeker

+0

Ho trovato una cosa interessante. Lo scorrimento automatico avviene solo quando l'area di testo è attiva. Dopo aver fatto clic nell'area di testo, le cose vanno storte. Se non faccio clic, posso scorrere i messaggi con la barra di scorrimento contemporaneamente con nuovi messaggi aggiunti e il testo non salta. – truthseeker

risposta

7

Se il problema è con il "Vertical Scroll" scorrendo verso il basso quando si sta aggiungendo il testo registro, ma si vorrebbe che fosse in cima tutto il tempo:

si deve aggiungere gestori di eventi a VScroll, Eventi TextChanged e nel gestore eventi impostare la scroll verso l'alto

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll; 
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll; 

private const UInt32 SB_TOP = 0x6; 
private const UInt32 WM_VSCROLL = 0x115; 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, 
    IntPtr wParam, IntPtr lParam); 

private void HandleRichTextBoxAdjustScroll(Object sender, 
    EventArgs e) 
{ 
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero); 
} 

Si potrebbe fare lo stesso anche con la barra di scorrimento orizzontale. Sostituire WM_VSCROLL con WM_HSCROLL e SB_TOP con SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114; 
private const UInt32 SB_LEFT = 0x06; 
0

Puoi provare tb_logs.SelectionLength = 1; insieme a SelectionStart. Questo renderà 1 char selezionato dalla tua posizione attuale.

non provato ... Ma può funzionare

Problemi correlati