Il controllo RichTextBox scorre automaticamente alla selezione corrente, se la selezione non è nascosta. RichTextBox.AppendText(), oltre ad aggiungere testo, modifica anche la selezione corrente, attivando così indirettamente il comportamento di "autoscrolling". Si noti che se RichTextBox.HideSelection è impostato su true, la selezione verrà nascosta quando il controllo non è a fuoco; questo spiega il comportamento che hai descritto, in cui lo scorrimento automatico avviene solo quando l'utente fa clic nel controllo. (Dando in tal modo messa a fuoco) Per evitare questo, è necessario effettuare le seguenti operazioni quando si aggiunge il testo:
- Backup la selezione iniziale
- unfocus il controllo
- Nascondi selezione (attraverso un messaggio di Windows)
- AppendText
- ripristinare la selezione iniziale selezione
- Unhide
- Refocus controllo
Si potrebbe anche voler verificare se la selezione è già alla fine del testo e consentire il comportamento di autoscrettatura se questo è - questo essenzialmente emula il comportamento della finestra di output di Visual Studio. Ad esempio: soluzione
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
const int WM_USER = 0x400;
const int EM_HIDESELECTION = WM_USER + 63;
void OnAppend(string text)
{
bool focused = richTextBox1.Focused;
//backup initial selection
int selection = richTextBox1.SelectionStart;
int length = richTextBox1.SelectionLength;
//allow autoscroll if selection is at end of text
bool autoscroll = (selection==richTextBox1.Text.Length);
if (!autoscroll)
{
//shift focus from RichTextBox to some other control
if (focused) textBox1.Focus();
//hide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0);
}
richTextBox1.AppendText(text);
if (!autoscroll)
{
//restore initial selection
richTextBox1.SelectionStart = selection;
richTextBox1.SelectionLength = length;
//unhide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0);
//restore focus to RichTextBox
if(focused) richTextBox1.Focus();
}
}
La tua soluzione funziona come un fascino! Ho provato tanti altri approcci per impedire al mio RichTextBox di scorrere dopo aver apportato modifiche alla formattazione, e questo era l'unico che funzionava. All'inizio sembrava complicato, ma ha funzionato :) –