En mi aplicación WinForm tengo un control TextBox de líneas múltiples (uiResults) que se utiliza para informar el progreso mientras se procesa una gran cantidad de elementos. Usar AppendText funciona muy bien para desplazarse automáticamente hacia abajo en cada actualización, pero si el usuario se desplaza hacia atrás para leer algunos datos anteriores, necesito desactivar el desplazamiento automático. Preferiría mantenerme alejado de las llamadas de P/Invoke si es posible.Mantener la posición de desplazamiento de TextBox al agregar la línea
¿Es posible detectar si el usuario se ha desplazado hacia atrás sin utilizar P/Invoke? Por ahora, sólo echa un SelectionStart que funciona, pero requiere que el usuario mueva el cursor desde el final de la caja de texto para detener el desplazamiento automático:
if(uiResults.SelectionStart == uiResults.Text.Length)
{
uiResults.AppendText(result + Environment.NewLine);
}
Mi principal problema es que al anexar una cadena utilizando la propiedad Text, la El cuadro de texto se desplaza hacia el principio. Traté de resolver esto almacenando la posición de intercalación y reiniciando y desplazándome hacia ella después de la actualización, pero esto hace que la línea actual se mueva hacia abajo (por supuesto, ya que ScrollToCaret no desplaza más de la distancia necesaria para ver la interpolación)
[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 se activa cuando la barra de desplazamiento vertical se mueve y NO se dispara a través de AppendText. ¿Hay diferentes mensajes para atrapar? –
@Brad Rem. No entendiste tu pregunta completa. Actualizado. –