내 프로그램은 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();
}
답변
RichTextBox는 포커스가 있고 AppendText를 사용하여 정보를 추가하는 경우 끝까지 스크롤 된 상태로 유지됩니다. HideSelection을 False로 설정하면 포커스를 잃을 때 선택을 유지하고 자동 스크롤 상태를 유지합니다.
아래 방법을 사용하여 로그 뷰어 GUI를 설계했습니다. 전체 코어를 유지하는 데 사용되었습니다. 이 코드를 제거하고 HideSelection을 False로 설정하면 CPU 사용량이 1-2 %로 감소했습니다.
//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
답변
간단하게 유지하겠습니다.
-
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);
}
답변
[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_TextChanged
위와 같은 이벤트를 사용했습니다 . 그러나 나는 이것이 해결 방법이라고 생각하고 다른 사람이 찾는 경우 실제 솔루션을 문서화하고 싶었습니다.
추가하면 자동 스크롤되지만에 RichTextBox
초점을 맞춰야합니다. 따라서 자동 스크롤을 확인 Focus
하기 AppendText
위해 전에 전화 하십시오.
richTextBox.Focus();
richTextBox.AppendText(text);
답변
새 데이터를 쓸 때 사용 AppendText()
하면 위로 스크롤하지 않고 항상 맨 아래에 있습니다.