我的程序调用Java,然后将stdout重定向到一个RichTextBox
。我的问题是每次写入数据时,垂直滚动条总是停留在框的顶部。
即使你滚动到底部,一旦写入新数据,它就会回到顶部。我希望相反的情况发生。
因此,当写入新数据时,它会停留在底部。我该怎么办?
我的程序调用Java,然后将stdout重定向到一个RichTextBox
。我的问题是每次写入数据时,垂直滚动条总是停留在框的顶部。
即使你滚动到底部,一旦写入新数据,它就会回到顶部。我希望相反的情况发生。
因此,当写入新数据时,它会停留在底部。我该怎么办?
是的,您可以使用 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();
}
我会简洁明了地说明:
将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);
}
//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
ScrollToEnd()
不是一个可用的方法。 - Jeff BScrollToEnd()
方法。 - DrWu [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;
}
使用上述方法,您可以将RichTextBox滚动到底部。
richTextBox.SelectionStart = richTextBox.Text.Length;
相同。 - Ray Chakrit这是一个老问题,但我曾经遇到过这个问题,并使用了上面的richTextBox_TextChanged
事件,它有效。但我觉得这是一种解决方法,想记录实际解决方案以防其他人寻找。
如果您添加文本,它将自动滚动,但必须聚焦于RichTextBox
。
因此,在AppendText
之前调用Focus
以确保它自动滚动。
richTextBox.Focus();
richTextBox.AppendText(text);
在编写新数据时,如果使用AppendText()
,它不会向上滚动,而是始终停留在底部。