c# - sirve - texto enriquecido html
El cuadro de Texto enriquecido se desplaza hacia abajo cuando se escriben nuevos datos en él (5)
Al escribir datos nuevos, si usa AppendText()
no se desplazará hacia arriba y siempre permanecerá en la parte inferior.
Mi programa llama a Java y luego redirige stdout a RichTextBox
. Mi problema es que la barra de desplazamiento vertical siempre permanece en la parte superior del cuadro cada vez que se escriben datos.
Incluso si se desplaza hacia abajo, una vez que se han escrito nuevos datos, se dirige a la parte superior. Me gustaría lo opuesto.
Entonces, cuando se escriben nuevos datos, permanecen en la parte inferior. ¿Cómo puedo hacer esto?
Esta es una vieja pregunta, pero tuve este problema y utilicé el evento richTextBox_TextChanged
como el anterior, que funciona. Pero creo que esto es una solución alternativa y quería documentar la solución real en caso de que alguien más la busque.
Si lo agrega, se desplazará automáticamente, sin embargo, se debe enfocar el RichTextBox
. Así que llame a Focus
antes de AppendText
para asegurarse de que se desplaza automáticamente.
richTextBox.Focus();
richTextBox.AppendText(text);
RichTextBox se mantendrá desplazado hasta el final si tiene foco y utiliza AppendText para agregar la información. Si configura HideSelection en False, mantendrá su selección cuando pierda el foco y permanezca desplazado automáticamente.
Diseñé una GUI de Log Viewer que usaba el método a continuación. Usó hasta un núcleo completo para mantenerse al día. Deshacerse de este código y configurar HideSelection en False redujo el uso de la CPU al 1-2%
//Don''t use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
Sí, puedes usar el método ScrollToCaret()
:
// bind this method to its TextChanged event handler:
// richTextBox.TextChanged += richTextBox_TextChanged;
private void richTextBox_TextChanged(object sender, EventArgs e) {
// set the current caret position to the end
richTextBox.SelectionStart = richTextBox.Text.Length;
// scroll it automatically
richTextBox.ScrollToCaret();
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_VSCROLL = 277;
private const int SB_PAGEBOTTOM = 7;
internal static void ScrollToBottom(RichTextBox richTextBox)
{
SendMessage(richTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
richTextBox.SelectionStart = richTextBox.Text.Length;
}
ScrollToBottom (richTextBox);
utilizando el método anterior, puede desplazar el cuadro de texto enriquecido a la parte inferior