当新数据写入富文本框时,它会滚动到底部

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

【讨论】:

也不起作用。投反对票只是为了让其他用户更容易看到。

以上是关于当新数据写入富文本框时,它会滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

在输入/复制到富文本框时防止闪烁

html滚动文本框

如何将 RichTextBox 滚动到底部?

富文本编辑器

富文本编辑器

富文本框值存储在数据库中