新的数据写入时,富文本框滚动到底部

我的程序调用Java,然后将stdoutredirect到RichTextBox 。 我的问题是,每次写入数据时,垂直滚动条总是停留在方框的顶部。

即使你滚动到底部,一旦新的数据被写入,它会到达最上面。 我想相反。

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

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

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

我devise了一个使用下面的方法的日志查看器GUI。 它使用了一个完整的核心保持。 摆脱这个代码并将HideSelection设置为False,CPU使用率下降到1-2%

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

这是一个古老的问题,但我有这个问题,我用richTextBox_TextChanged事件,如上所述,它的工作原理。 但我觉得这是一个解决方法,并希望logging下其他人查找的实际解决scheme。

如果您追加它将自动滚动,但是RichTextBox必须被集中。 因此,在AppendText之前调用Focus以确保它自动滚动。

 richTextBox.Focus(); richTextBox.AppendText(text); 

当写入新的数据时,如果使用AppendText()它将不会向上滚动并始终停留在底部。

倒出展开进度par parexample =>

 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(); } } }