新的数据写入时,富文本框滚动到底部
我的程序调用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(); } } }