2012-02-23 59 views
48

我的程序调用Java,然后将stdout重定向到RichTextBox。我的问题是每次写入数据时,垂直滚动条总是停留在方框的顶部。将新数据写入到底部时,富文本框滚动到底部

即使您滚动到底部,一旦写入新数据,它就会到达顶部。我想相反。

因此,当写入新数据时,它停留在底部。我怎样才能做到这一点?

+0

对于一个WPF/XAML项目,请参阅[WPF的RichTextBox,自动滚动到结束(http://stackoverflow.com/q/10308475) – 2013-10-15 23:00:04

回答

91

是的,你可以使用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

我想通了。由于某些原因,在VS 2010中,我不得不点击富文本框,然后点击事件,然后找到TExted并将其链接到“myrichTextBox_TextChanged”。有用的原因。 – user1158745 2012-02-23 19:41:23

+0

由于某些原因,Visual Studio 2017不提供此属性作为选项。这是否被弃用? – SubjectX 2017-07-13 16:26:51

+0

@SubjectX该文档声明它在当前版本的.Net框架中仍然可用。 – 2017-07-14 19:38:53

-2

当写入新的数据,如果使用AppendText()它不会滚动起来,将永远留在底部。

+3

错!它停留在selectedPosition上。 – jAC 2013-06-04 08:31:05

+4

AppendText自动滚动很好提供myRichTextBox.HideSelection = false; – Philippe 2014-10-02 20:01:15

11

如果RichTextBox具有焦点并且使用AppendText添加信息,则RichTextBox将保持滚动到最后。如果您将HideSelection设置为False,它会在失去焦点并保持自动滚动时保持其选择状态。

我设计了一个使用下面方法的Log Viewer GUI。它用完了一个完整的核心。摆脱这个代码,并设置HideSelection为False得到了CPU使用率下降到1-2%

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

这是为WPF RichTextBox。 'ScrollToEnd()'不是WinForms版本可用的方法。 – 2014-08-20 19:54:06

+0

它继承自ScrollToEnd()' – DrWu 2014-09-03 22:58:46

+0

的TextBoxBase我没有在['System.Windows.Forms.TextBoxBase'](http://msdn.microsoft.com/en-us/)的文档中看到它。 library/system.windows.forms.textboxbase(v = vs.110).aspx),它由['RichTextBox'](http://msdn.microsoft.com/en-us/library/system.windows。 forms.richtextbox(v = vs.110).aspx)for WinForms。 – 2014-09-04 03:25:38

-2

倒未玷污革新面值为例=>

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

这是一个老问题,但我有这个问题,我使用上面的richTextBox_TextChanged事件,这是有效的。但我觉得这是一种解决方法,并希望记录实际的解决方案,以防其他人查找它。

如果您追加它会自动滚动,但是RichTextBox必须重点。 请在AppendText之前致电Focus以确保其自动滚动。

richTextBox.Focus(); 

richTextBox.AppendText(text); 
+0

也不工作。 Downvoting只是为了让其他用户更容易看到。 – SubjectX 2017-07-13 16:24:53