[c#] 새 데이터가 기록되면 서식있는 텍스트 상자가 맨 아래로 스크롤됩니다.

내 프로그램은 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()하면 위로 스크롤하지 않고 항상 맨 아래에 있습니다.


답변