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

本文关键字:文本 滚动 底部 新数据 数据 | 更新日期: 2023-09-27 18:25:39

我的程序调用Java,然后将stdout重定向到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添加信息,它将一直滚动到最后。如果将"隐藏选择"设置为False,它将在失去焦点时保持选择并保持自动滚动。

我使用下面的方法设计了一个日志查看器GUI。它使用了一个完整的核心保持。删除此代码并将HideSelection设置为False可使CPU使用率降至1-2%

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

我会保持简单:

  • 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);
}
    [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;
    }

滚动到底(richTextBox);

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

在写入新数据时,如果使用AppendText(),它不会向上滚动,而是始终位于底部。

这是一个老问题,但我遇到了这个问题,我使用了如上所述的richTextBox_TextChanged事件,它有效。但我觉得这是一个变通办法,并想记录实际的解决方案,以防其他人寻找它

如果附加,它将自动滚动,但是RichTextBox必须聚焦。所以在AppendText之前调用Focus以确保它自动滚动。

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