2012-02-23 8 views
48

Mi programa llama a Java y luego redirige a 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.Cuadro de texto enriquecido se desplaza hacia la parte inferior cuando se escriben datos nuevos

Incluso si se desplaza hacia la parte inferior, una vez que se han escrito datos nuevos, va hacia arriba. Me gustaría lo opuesto.

Por lo tanto, cuando se escriben nuevos datos, se quedan en la parte inferior. ¿Cómo puedo hacer esto?

+0

Para un proyecto WPF/XAML, ver [WPF RichTextBox, desplazamiento automático a final] (http://stackoverflow.com/q/10308475) –

Respuesta

91

sí, se puede utilizar el método de 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(); 
} 
+0

lo he descubierto. por alguna razón, en VS 2010, tuve que hacer clic en el cuadro de texto enriquecido, luego hacer clic en eventos, luego encontrar TExted cambiado y vincularlo a "myrichTextBox_TextChanged". Por la razón que funcionó. – user1158745

+0

Por alguna razón, Visual Studio 2017 no ofrece esta propiedad como una opción. ¿Esto está en desuso? – SubjectX

+0

@SubjectX La documentación indica que todavía está disponible en la versión actual de .Net framework. –

-2

Al escribir nuevos datos, si utiliza AppendText() no lo puedo desplazarse hacia arriba y permanecerá siempre en la parte inferior.

+3

¡Incorrecto! Permanece en la posición seleccionada. – jAC

+4

AppendText se desplaza automáticamente bien provisto myRichTextBox.HideSelection = false; – Philippe

11

El 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 del Visor de registros que utilizaba el método siguiente. Usó hasta un núcleo completo para mantenerse al día. Deshacerse de este código y el establecimiento de HideSelection en False consiguió el uso de la CPU hasta 1-2%

//Don't use this! 
richTextBox.AppendText(text); 
richTextBox.ScrollToEnd(); 
+0

Esto es para WPF RichTextBox. 'ScrollToEnd()' no es un método disponible en la versión de WinForms. –

+0

Hereda de TextBoxBase que tiene 'ScrollToEnd()' – DrWu

+0

No lo veo en la documentación de ['System.Windows.Forms.TextBoxBase'] (http://msdn.microsoft.com/en-us/ library/system.windows.forms.textboxbase (v = vs.110) .aspx) heredado por ['RichTextBox'] (http://msdn.microsoft.com/en-us/library/system.windows. forms.richtextbox (v = vs.110) .aspx) para WinForms. –

-2

Pour un défilement progressif par exemple =>

namespace SongTabs 
    { 
     public class RichTextBoxAutoScroll 
     { 
      protected int LineJump { get; set; } 
      protected int ActualLine = 1; 
      Timer Timer { get; set; } 
      RichTextBox RichTextBox { get; set; } 
      public RichTextBoxAutoScroll(RichTextBox rtb,int speed,int linejump) 
      { 
       this.LineJump = linejump; 
       this.RichTextBox = rtb; 
       this.Timer = new Timer(); 
       this.Timer.Interval = speed; 
       this.Timer.Tick += Timer_Tick; 
      } 

      void Timer_Tick(object sender, EventArgs e) 
      { 
       RichTextBox.SelectionStart = RichTextBox.GetFirstCharIndexFromLine(ActualLine); 
       RichTextBox.ScrollToCaret(); 
       ActualLine += LineJump; 
      } 
      public void Start() 
      { 
       Timer.Start(); 
      } 
     } 
    } 
-1

Ésta es una vieja pregunta, pero yo tenía 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 añade, se desplazará automáticamente, sin embargo, se debe enfocar el RichTextBox. Llame al Focus antes de AppendText para asegurarse de que se desplaza automáticamente.

richTextBox.Focus(); 

richTextBox.AppendText(text); 
+0

tampoco funciona. Downvoting solo para ser más visible para otros usuarios. – SubjectX

Cuestiones relacionadas