c# - RichTextBox ScrollToCaret 的结果不一致

标签 c# scroll richtextbox

我正在使用 C# 中的 RichTextBox。它存在于 TabPage 上。选择 TabPage 后,我的目标是填充 RichTextBox,然后滚动到末尾。我尝试了针对这个常见问题的解决方案的细微变化,主要的是:

MyRichTextBox.Select(MyRichTextBox.Text.Length, 0);  
MyRichTextBox.ScrollToCaret();  

或者:

MyRichTextBox.SelectionStart = MyRichTextBox.Text.Length;  
MyRichTextBox.ScrollToCaret();  

这会产生不一致的结果,尽管是以一种可预测的方式。它将在滚动到底部和滚动到距离底部少一行之间交替。分别说明(对不起链接,新用户所以我不能发布图片):
Successfully scrolled to bottom
Scrolled to one line short of the bottom
我很惊讶在我的搜索中没有发现任何提及这种行为的信息,因此我决定询问这里是否有人遇到过这种情况,和/或是否有解决方案。如果归结为它,我想我可以按照 itsmatt's answer 的方式去做。 .

最佳答案

我对 ScrollToCaret 做了一些进一步的实验,但它并不是每次都在相同的位置结束。由于我的目标仅限于一直滚动到底部,因此它是将 WM_VSCROLL 消息(277 或 0x115)发送到控件的一个很好的候选者,wParam 为 SB_PAGEBOTTOM (7)。这完全按照我的需要一直滚动到最底部:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_VSCROLL = 277;
private const int SB_PAGEBOTTOM = 7;

public static void ScrollToBottom(RichTextBox MyRichTextBox)
{
    SendMessage(MyRichTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
}

关于c# - RichTextBox ScrollToCaret 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535102/

相关文章:

html - Twitter 小部件不会随着 IE 上的页面滚动

.net - c# - 完美的语法高亮

c# - NHibernate:防止刷新触发未初始化的集合

c# - 我们可以用 C# 中的对象替换 if 语句吗

c# - 在 C# 中刷新数据 View 网格

winforms - RTF 字符串字体大小

c# - Xamarin.Forms 中的富文本框

c# - ItemsControl 在数据更改为 ObservableCollection<T> 属性后不更新

scroll - 设计一个可滚动的网站?

javascript - 当我的可滚动 div 达到一定高度时,如何使图像消失?