在向其写入新数据时,“富文本”框会滚动到底部

问题描述 投票:61回答:6

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

即使您滚动到底部,一旦写入新数据,它就会转到顶部。我想反其道而行之。

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

c# winforms richtextbox
6个回答
130
投票

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

13
投票

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

我设计了一个使用以下方法的Log Viewer GUI。它使用了一个完整的核心保持。摆脱此代码并将HideSelection设置为False后,CPU使用率降至1-2%

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

5
投票
    [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中);

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


3
投票

我会保持简单:

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

-2
投票

在编写新数据时,如果使用AppendText(),它将不会向上滚动并始终保持在底部。


-2
投票

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

如果你追加它将自动滚动,但RichTextBox必须集中。所以在Focus之前调用AppendText以确保它自动滚动。

richTextBox.Focus();

richTextBox.AppendText(text);
© www.soinside.com 2019 - 2024. All rights reserved.