将新数据写入时,RTF文本框滚动到底部


78

我的程序调用Java,然后将stdout重定向到RichTextBox。我的问题是,每次写入数据时,垂直滚动条始终位于框的顶部。

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

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


对于WPF / XAML项目,请参阅WPF RichTextBox,自动滚动到结束
Danny Beckett

Answers:


156

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

我想到了。由于VS 2010中的某种原因,我必须单击富文本框,然后单击事件,然后找到已更改的TExted,并将其链接到“ myrichTextBox_TextChanged”。由于某些原因,它起作用了。
user1158745 '02

1
由于某些原因,Visual Studio 2017不提供此属性作为选项。不推荐使用吗?
SubjectX

@SubjectX文档指出,它在.Net框架的当前版本中仍然可用。
奥马尔

尽管此答案是一个更简单的解决方案,但@Prem Kumar Badri的答案总的来说更好,因为它不会干扰用户的文本选择,并且也没有奇怪的垂直对齐问题
Leo Bottaro

19

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

我设计了使用以下方法的Log Viewer GUI。它用尽了整个核心。摆脱此代码并将HideSelection设置为False,可使CPU使用率降低到1-2%

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

3
这是用于WPF RichTextBox的。ScrollToEnd()不是WinForms版本上可用的方法。
杰夫B

它继承自TextBoxBase,它确实具有ScrollToEnd()
DrWu

我没有在WinFormsSystem.Windows.Forms.TextBoxBase继承的文档中看到它RichTextBox
2014年

6
啊,我看错了。你是对的。但是我的解决方案是无论如何都不要使用它。我能够使用AppendText和HideSelection设置为false以获得更有效的解决方案。
DrWu 2014年

1
更多代码更多问题,这种解决方案没有代码,因此在我看来更加优雅
Max Carroll

12

我将保持简单:

  • HideSelection属性设置为false

  • 使用AppendText()方法将文本添加到RichTextBox。

码:

RichTextBox rtbTest;

void InitRichTextBox()
{
    //Init rtbTest...

    rtbTest.HideSelection = false;//Hide selection so that AppendText will auto scroll to the end
}

void AddText(string txt)
{
    rtbTest.AppendText(txt);
}

9
    [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);

通过使用上述方法,您可以将富文本框滚动到底部


1
谢谢。其他方法都不适合我。这个工作了。由于某种原因,一旦文本框开始变得太满,其他方法将不再起作用。
杰里米

非常感谢您发布此信息!对于RichTextBox,如果您在文本末尾没有换行,则使用其他方法似乎不会使其完全向下滚动。
沃尔特·毕晓普

与ScrollToCaret相比,这有效并且提供了更好的性能。谢谢。
罗马

这可以很好地工作,因为您可以将HideSelection属性设置为true,所以用较大的文本替换框中的整个文本时,不会出现令人讨厌的闪烁。
luci88filter


-2

这是一个古老的问题,但是我遇到了这个问题,因此我使用了richTextBox_TextChanged上面的事件,该事件有效。但是我认为这是一种解决方法,因此希望记录实际的解决方案,以防其他人寻找它。

如果追加,它将自动滚动,但是RichTextBox必须重点关注。所以调用Focus之前AppendText,以确保它自动滚动。

richTextBox.Focus();

richTextBox.AppendText(text);

也不起作用。投票只是为了让其他用户更容易看到。
SubjectX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.