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();
}
WM_VSCROLL viene generato quando la barra di scorrimento verticale viene spostata e NON viene attivata tramite AppendText. C'è un messaggio diverso da prendere? –
@Brad Rem. Non ho capito la tua domanda completa. Aggiornato. –