我有一个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
结果如下:
在上面的屏幕截图中,您几乎可以看出边缘下面实际上有更多文字。您还可以查看右侧的滚动条,看到下面还留有一点空间。
在上面的屏幕截图中,我使用右侧的滚动条手动向下滚动到底部;露出隐藏的文字。
有没有办法确保RichTextBox每次都自动滚动到最后?
答案 0 :(得分:0)
此内容改编自this answer,解决了有时截断最后一行的问题。
我将答案扩展为在TextBoxBase
上用作扩展方法,以便它对TextBox
和RichTextBox
都适用。
用法:
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);
}
}