RichTextBox 滚动到末尾

4

我有一个RichTextBox,当新的文本被添加时,我希望它自动滚动到文本的末尾。

这是我的代码:

private void outputWindowTextChanged(object sender, EventArgs e) {
    rtb_outputWindow.SelectionStart = rtb_outputWindow.Text.Length;
    rtb_outputWindow.ScrollToCaret();
}

我手动向RichTextBox添加了一些文本,就像这样:

updateOutputWindow("Lorem ipsum dolor sit amet, ..."); //These strings are really long
updateOutputWindow("Lorem ipsum dolor sit amet, ..."); //I shortened them for this question

这是结果:

screenshot1

在上面的截图中,你可以勉强看出边缘下方实际上还有更多文本。你也可以查看右侧的滚动条,看到底部还留有一点空间。

screenshot2

在上面的截图中,我手动使用右侧的滚动条向下滚动到底部,揭示了之前隐藏的文本。

是否有一种方法可以确保 RichTextBox 每次自动滚动到最末端?


@TimothyGroote,RichTextBox不包含“CaretPosition”的定义。 - user6334610
@TimothyGroote,我经常听到人们问我是否使用win.forms。我得出的结论是,更有技能的程序员使用其他东西?不确定该怎么称呼它。另一个API,也许?我假设有很多可以选择的。你能推荐一个我应该尝试的吗?顺便问一下,你找到解决我手头问题的方法了吗? - user6334610
@Phrosen,他们的技能水平并不一定是使用winForms以外的东西的原因;这部分是偏好问题。一个绝对值得考虑的是WPF(我在这里盲目地假设了这种情况),但它引入了许多超出UI框架的新概念和范例,所以如果你决定学习它,要准备好同时面对很多东西。目前还没有找到解决方案;你的代码已经按照正确的方式执行了。我怀疑你的问题可能是“textchanged”事件的时间问题。 - Timothy Groote
1
尝试将“设置插入符号并滚动到它”的代码直接放置在最后一次调用 updateOutputWindow 之后。 - Timothy Groote
你尝试过设置 rtb_outputWindow.HideSelection = false; 然后使用 AppendText 将新行添加到文本框中吗?(这应该也会自动滚动文本框) - Timothy Groote
显示剩余4条评论
1个回答

2
这是从这个答案中改编的,解决了有时最后一行被截断的问题。
我将答案扩展为TextBoxBase的扩展方法,以便它可以同时适用于TextBoxRichTextBox
使用方法:
rtb_outputWindow.ScrollToBottom();

实现:

public static class RichTextBoxUtils
{
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern int SendMessage(System.IntPtr hWnd, int wMsg, System.IntPtr wParam, System.IntPtr lParam);

    private const int WM_VSCROLL = 0x115;
    private const int SB_BOTTOM = 7;

    /// <summary>
    /// Scrolls the vertical scroll bar of a text box to the bottom.
    /// </summary>
    /// <param name="tb">The text box base to scroll</param>
    public static void ScrollToBottom(this System.Windows.Forms.TextBoxBase tb)
    {
        if (System.Environment.OSVersion.Platform != System.PlatformID.Unix)
            SendMessage(tb.Handle, WM_VSCROLL, new System.IntPtr(SB_BOTTOM), System.IntPtr.Zero);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接