2012-04-16 3 views
6

Nella mia applicazione WinForm ho un controllo TextBox multilinea (uiResults) che viene utilizzato per segnalare i progressi durante l'elaborazione di un numero elevato di elementi. Usando AppendText funziona alla grande per lo scorrimento automatico verso il basso ad ogni aggiornamento, ma se l'utente scorre indietro per leggere alcuni dati precedenti ho bisogno di disattivare lo scorrimento automatico. Preferirei stare lontano dalle chiamate P/Invoke se possibile.Mantieni la posizione di scorrimento del TextBox durante l'aggiunta della riga

È possibile rilevare se l'utente ha eseguito lo scorrimento indietro senza utilizzare P/Invoke? Per il momento, ho solo controllare SelectionStart che funziona ma richiede all'utente di spostare il cursore alla fine della casella di testo per fermare l'autoscroll:

if(uiResults.SelectionStart == uiResults.Text.Length) 
{ 
    uiResults.AppendText(result + Environment.NewLine); 
} 

Il mio problema principale è che quando si aggiunge una stringa utilizzando la proprietà Text, il la casella di testo scorre verso l'inizio. Ho provato a risolvere questo problema memorizzando la posizione del cursore e resettandomi e scorrendola dopo l'aggiornamento, ma questo fa spostare la linea corrente verso il basso (ovviamente, poiché ScrollToCaret scorre non più della distanza necessaria per visualizzare il punto di vista).

[Continued from above] 
else 
{ 
    int pos = uiResults.SelectionStart; 
    int len = uiResults.SelectionLength; 
    uiResults.Text += result + Environment.NewLine; 
    uiResults.SelectionStart = pos; 
    uiResults.SelectionLength = len; 
    uiResults.ScrollToCaret(); 
} 

risposta

2

Auto-scrolling text box uses more memory than expected

Il codice in questione implementa esattamente quello che stai cercando. Il testo viene aggiunto, ma lo scorrimento avviene solo se la barra di scorrimento si trova in fondo.

+0

WM_VSCROLL viene generato quando la barra di scorrimento verticale viene spostata e NON viene attivata tramite AppendText. C'è un messaggio diverso da prendere? –

+0

@Brad Rem. Non ho capito la tua domanda completa. Aggiornato. –

0

Sei aperto a un altro approccio, perché sei destinato a metterti nei guai in questo modo e le soluzioni diventeranno complesse (eccetto che vuoi evitare). Per es. Supponiamo di trovare un modo per "rilevare se l'utente ha fatto scorrere indietro" e si smette di scorrere verso il basso. Ma dopo aver letto la riga, l'utente potrebbe voler riprendere la funzione di scorrimento in basso. Quindi, perché non dare all'utente un modo per controllare lo scorrimento automatico. Ecco come lo farei ...

Utilizzare un RichTextBox per visualizzare i dati e una casella di controllo per controllare lo scorrimento automatico, quindi il codice potrebbe essere qualcosa di simile:

 richTextBox1.AppendText(result + Environment.NewLine); 
     if (checkBoxAutoScroll.Checked) 
     { 
      richTextBox1.SelectionStart = richTextBox1.Text.Length; 
      richTextBox1.ScrollToCaret(); 
     } 

RichTextBox di default non scorrerà automaticamente in basso su AppendText, quindi la prima riga sarà sempre visibile (e non la riga appena aggiunta). Ma se l'utente controlla questa casella denominata AutoScroll, il nostro codice farà scorrere la casella di testo verso il basso dove vengono mostrate le nuove linee. Se l'utente vuole scorrere manualmente per leggere una riga, dovrà prima deselezionare la casella di controllo.

+1

Sfortunatamente, sembra che anche 'RichTextBox' scorre verso il basso quando si usa 'AppendText' - ma solo quando il controllo è attivo. Ma poiché gli utenti a volte hanno bisogno di selezionare e copiare il testo, questo approccio purtroppo non funzionerà. – Anlo

Problemi correlati