El control RichTextBox se desplaza automáticamente a la selección actual, si la selección no está oculta. RichTextBox.AppendText(), además de agregar texto, también modifica la selección actual y, por lo tanto, desencadena indirectamente el comportamiento de "autoscroll". Tenga en cuenta que si RichTextBox.HideSelection se establece en verdadero, la selección se ocultará cuando el control no esté enfocado; esto explica el comportamiento que describió, donde el desplazamiento automático ocurre solo cuando el usuario hace clic en el control. (Dando así el foco) Para evitar esto, es necesario hacer lo siguiente al anexar texto:
- copia de seguridad de la selección inicial
- unfocus el control
- Ocultar selección (a través de un mensaje de Windows)
- AppendText
- Restaurar la selección inicial selección
- Unhide
- Refocus el control
Es posible que también desee comprobar si la selección ya está al final del texto, y permitir el comportamiento de desplazamiento automático, si es así, esto esencialmente emula el comportamiento de la ventana de resultados de Visual Studio. Por ejemplo: solución
[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();
}
}
¡Su solución funciona como un encanto! Probé muchos otros enfoques para evitar que mi RichTextBox se desplazara después de realizar cambios de formato, y este fue el único que funcionó. Parecía intrincado al principio, pero funcionó :) –