当新数据写入富文本框时,它会滚动到底部
Posted
技术标签:
【中文标题】当新数据写入富文本框时,它会滚动到底部【英文标题】:Rich Text box scroll to the bottom when new data is written to it 【发布时间】:2012-03-14 01:38:29 【问题描述】:我的程序调用 Java,然后将标准输出重定向到 RichTextBox
。我的问题是每次写入数据时垂直滚动条总是停留在框的顶部。
即使您滚动到底部,一旦写入新数据,它就会移到顶部。我想要相反的。
因此,当写入新数据时,它会停留在底部。我该怎么做?
【问题讨论】:
对于 WPF/XAML 项目,请参阅WPF RichTextBox, auto scroll to end 【参考方案1】:是的,您可以使用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();
【讨论】:
我想通了。出于某种原因,在 VS 2010 中,我不得不单击富文本框,然后单击事件,然后找到 TExted 已更改并将其链接到“myrichTextBox_TextChanged”。出于某种原因,它起作用了。 出于某种原因,Visual Studio 2017 不提供此属性作为选项。是否已弃用? @SubjectX 文档指出它在当前版本的 .Net 框架中仍然可用。 虽然这个答案是一个更简单的解决方案,但@Prem Kumar Badri 下文的答案总体上效果更好,因为它不会干扰用户的文本选择,也没有奇怪的垂直对齐问题【参考方案2】:如果 RichTextBox 具有焦点并且您使用 AppendText 添加信息,它将保持滚动到末尾。如果您将 HideSelection 设置为 False,它将在失去焦点时保持其选择并保持自动滚动。
我设计了一个使用以下方法的日志查看器 GUI。它使用了一个完整的核心来跟上。摆脱此代码并将 HideSelection 设置为 False 可使 CPU 使用率降至 1-2%
//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
【讨论】:
这是针对 WPF RichTextBox 的。ScrollToEnd()
不是 WinForms 版本上可用的方法。
它继承自 TextBoxBase,它确实有 ScrollToEnd()
我在 System.Windows.Forms.TextBoxBase
的文档中没有看到它,它由 WinForms 的 RichTextBox
继承。
啊,我看错了。你是对的。但是我的解决方案是无论如何都不要使用它。我能够使用 AppendText 和 HideSelection 来获得更有效的解决方案。
更多代码更多问题,这个解决方案没有代码,因此在我看来更优雅【参考方案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);
【讨论】:
就是这样。【参考方案4】: [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);
通过使用上述方法,您可以将富文本框滚动到底部
【讨论】:
谢谢。其他方法都不适合我。这个有效。由于某种原因,一旦文本框开始变得太满,其他方法就不再起作用了。 非常感谢您发布此消息!似乎对于 RichTextBox,如果文本末尾没有新行,则使用其他方法不会使其一直向下滚动。 这工作并提供比 ScrollToCaret 更好的性能。谢谢。 这很好用,因为您可以将 HideSelection 属性设置为 true,这样当您将框中的整个文本替换为较大的文本时,就不会出现烦人的闪烁。 这对我来说也适用于隐藏的文本框。【参考方案5】:写入新数据时,如果你使用AppendText()
,它不会向上滚动,会一直停留在底部。
【讨论】:
错了!它停留在 selectedPosition。 AppendText 可以很好地自动滚动 myRichTextBox.HideSelection = false;【参考方案6】:这是一个老问题,但我遇到了这个问题,我使用了上面的richTextBox_TextChanged
事件,它有效。但我觉得这是一种解决方法,并希望记录实际的解决方案,以防其他人寻找它。
如果你追加它会自动滚动,但是RichTextBox
必须被聚焦。
所以在AppendText
之前调用Focus
以确保它自动滚动。
richTextBox.Focus();
richTextBox.AppendText(text);
【讨论】:
也不起作用。投反对票只是为了让其他用户更容易看到。以上是关于当新数据写入富文本框时,它会滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章