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


79

내 프로그램은 Java를 호출 한 다음 stdout을 RichTextBox. 내 문제는 데이터가 기록 될 때마다 수직 스크롤바가 항상 상자 상단에 유지된다는 것입니다.

맨 아래로 스크롤해도 새 데이터가 작성되면 맨 위로 이동합니다. 그 반대를 부탁드립니다.

따라서 새 데이터가 작성되면 맨 아래에 유지됩니다. 어떻게 할 수 있습니까?


WPF / XAML 프로젝트에 대한 내용은 WPF를 RichTextBox, 마지막에 자동 스크롤
대니 베켓

답변:


160

예, 다음 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"에 연결해야했습니다. 효과가 있었던 이유.
user1158745

1
어떤 이유로 Visual Studio 2017은이 속성을 옵션으로 제공하지 않습니다. 더 이상 사용되지 않습니까?
SubjectX

@SubjectX 문서에는 .Net 프레임 워크의 현재 버전에서 여전히 사용할 수 있다고 나와 있습니다.
Omar

이 대답은 간단한 해결책이지만, @Prem 쿠마 바드의 응답 울부 짖는 소리는 사용자의 텍스트 선택에 혼란을하지 않기 때문에 전반적으로 더 나은 작동하고 또한 이상한 수직 정렬 문제가없는
레오 Bottaro

19

RichTextBox는 포커스가 있고 AppendText를 사용하여 정보를 추가하는 경우 끝까지 스크롤 된 상태로 유지됩니다. HideSelection을 False로 설정하면 포커스를 잃을 때 선택을 유지하고 자동 스크롤 상태를 유지합니다.

아래 방법을 사용하여 로그 뷰어 GUI를 설계했습니다. 전체 코어를 유지하는 데 사용되었습니다. 이 코드를 제거하고 HideSelection을 False로 설정하면 CPU 사용량이 1-2 %로 감소했습니다.

//Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();

3
이것은 WPF RichTextBox 용입니다. ScrollToEnd()WinForms 버전에서 사용할 수있는 방법이 아닙니다.
Jeff B

그것은 가지고있는 TextBoxBase에서 상속합니다ScrollToEnd()
DrWu

for WinForms System.Windows.Forms.TextBoxBase가 상속 한 문서에는 표시되지 않습니다 RichTextBox.
제프 B

6
아, 잘못된 걸보고 있었어요. 당신이 올바른지. 그러나 내 해결책은 어쨌든 그것을 사용하지 않는 것이 었습니다. AppendText 및 HideSelection을 false로 사용하여 훨씬 더 효율적인 솔루션을 얻을 수있었습니다.
DrWu 2014 년

1
더 많은 코드 더 문제,이 soloution에는 코드가없는 때문에 내 의견에 더 ellegant입니다
최대 캐롤

14

간단하게 유지하겠습니다.

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

이게 방법이다.
BeachMiles

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

위의 방법을 사용하면 서식있는 텍스트 상자를 아래로 스크롤 할 수 있습니다.


1
감사합니다. 다른 방법 중 어느 것도 나를 위해 일하지 않았습니다. 이것은 작동했습니다. 어떤 이유로 텍스트 상자가 너무 가득 차기 시작하면 다른 방법이 더 이상 작동하지 않았습니다.
Jeremy

이것을 게시 해 주셔서 대단히 감사합니다! RichTextBox에서는 다른 방법을 사용하면 텍스트 끝에 새 줄이 없으면 완전히 아래로 스크롤되지 않습니다.
Walter Bishop

이것은 ScrollToCaret보다 작동하고 더 나은 성능을 제공합니다. 감사.
Roman

HideSelection 속성을 true로 설정하면 상자의 전체 텍스트를 더 큰 텍스트로 바꿀 때 성가신 깜박임이 발생하지 않기 때문에 이것은 정말 잘 작동합니다.
luci88filter

-2

이것은 오래된 질문이지만이 문제가 있었고 richTextBox_TextChanged위와 같은 이벤트를 사용했습니다 . 그러나 나는 이것이 해결 방법이라고 생각하고 다른 사람이 찾는 경우 실제 솔루션을 문서화하고 싶었습니다.

추가하면 자동 스크롤되지만에 RichTextBox초점을 맞춰야합니다. 따라서 자동 스크롤을 확인 Focus하기 AppendText위해 전에 전화 하십시오.

richTextBox.Focus();

richTextBox.AppendText(text);

작동하지 않습니다. 다른 사용자에게 더 잘 보이기 위해 반대 투표.
SubjectX

-3

새 데이터를 쓸 때 사용 AppendText()하면 위로 스크롤하지 않고 항상 맨 아래에 있습니다.


4
잘못된! selectedPosition에 유지됩니다.
JAC

6
AppendText는 자동 스크롤 기능을 제공합니다. myRichTextBox.HideSelection = false;
Philippe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.