Das Rich-Text-Feld wird nach unten gescrollt, wenn neue Daten darauf geschrieben werden

78

Mein Programm ruft Java auf und leitet stdout dann an a weiter RichTextBox. Mein Problem ist, dass die vertikale Bildlaufleiste jedes Mal, wenn Daten geschrieben werden, oben im Feld bleibt.

Selbst wenn Sie nach unten scrollen, werden neue Daten nach dem Schreiben nach oben verschoben. Ich hätte gerne das Gegenteil.

Wenn also neue Daten geschrieben werden, bleiben sie unten. Wie kann ich das machen?

user1158745
quelle
Für ein WPF / XAML-Projekt siehe WPF RichTextBox, Auto Scroll to End
Danny Beckett

Antworten:

156

Ja, Sie können die ScrollToCaret()Methode verwenden:

// 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();
}
Omar
quelle
Ich habe es herausgefunden. Aus irgendeinem Grund musste ich in VS 2010 auf das Rich-Text-Feld klicken, dann auf Ereignisse klicken, dann TExted geändert finden und es mit "myrichTextBox_TextChanged" verknüpfen. Aus gutem Grund, der funktioniert hat.
user1158745
1
Aus irgendeinem Grund bietet Visual Studio 2017 diese Eigenschaft nicht als Option an. Ist das veraltet?
SubjectX
@SubjectX In der Dokumentation wird angegeben, dass es in der aktuellen Version des .Net-Frameworks noch verfügbar ist.
Omar
Obwohl diese Antwort eine einfachere Lösung ist, funktioniert die Antwort unten von @Prem Kumar Badri insgesamt besser, da sie die Textauswahl des Benutzers nicht beeinträchtigt und auch keine seltsamen Probleme mit der vertikalen Ausrichtung aufweist
Leo Bottaro,
19

Die RichTextBox bleibt bis zum Ende gescrollt, wenn sie den Fokus hat und Sie AppendText verwenden, um die Informationen hinzuzufügen. Wenn Sie HideSelection auf False setzen, wird die Auswahl beibehalten, wenn der Fokus verloren geht, und der automatische Bildlauf wird fortgesetzt.

Ich habe eine Log Viewer-GUI entworfen, die die folgende Methode verwendet. Es verbrauchte bis zu einem vollen Kern, um Schritt zu halten. Wenn Sie diesen Code entfernen und HideSelection auf False setzen, wird die CPU-Auslastung auf 1-2% gesenkt.

//Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();
DrWu
quelle
3
Dies ist für die WPF RichTextBox. ScrollToEnd()ist in der WinForms-Version keine Methode verfügbar.
Jeff B
Es erbt von TextBoxBase, die hatScrollToEnd()
DrWu
Ich sehe es nicht in der Dokumentation, für System.Windows.Forms.TextBoxBasedie von RichTextBoxfor WinForms geerbt wird .
Jeff B
6
Ah, ich habe den falschen angeschaut. Du hast Recht. Meine Lösung war jedoch, das sowieso NICHT zu verwenden. Ich konnte AppendText und HideSelection für false verwenden, um eine viel effizientere Lösung zu erhalten.
DrWu
1
mehr Code mehr Probleme, diese Lösung hat keinen Code und ist daher meiner Meinung nach elleganter
Max Carroll
12

Ich werde es einfach halten:

  • Setzen Sie die HideSelectionEigenschaft auffalse

  • Verwenden Sie die AppendText()Methode, um RichTextBox Text hinzuzufügen.

Code:

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);
}
123iamking
quelle
9
    [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);

Mit der obigen Methode können Sie das Rich-Text-Feld nach unten scrollen

Prem Kumar Badri
quelle
1
Vielen Dank. Keine der anderen Methoden hat bei mir funktioniert. Dieser hat funktioniert. Aus irgendeinem Grund funktionierten die anderen Methoden nicht mehr, sobald das Textfeld zu voll wurde.
Jeremy
Vielen Dank für die Veröffentlichung! Es scheint, als würde RichTextBox mit den anderen Methoden nicht ganz nach unten scrollen, wenn Sie am Ende des Textes keine neue Zeile haben.
Walter Bishop
Dies funktioniert und bietet eine bessere Leistung als ScrollToCaret. Vielen Dank.
Roman
Dies funktioniert sehr gut, da Sie die HideSelection-Eigenschaft auf true setzen können und kein störendes Flackern auftritt, wenn Sie den gesamten Text im Feld durch größeren Text ersetzen.
luci88filter
-2

Wenn Sie neue Daten schreiben, AppendText()scrollen Sie nicht nach oben und bleiben immer ganz unten.

Gayan Dasanayake
quelle
4
Falsch! Es bleibt an der ausgewählten Position.
JAC
6
AppendText führt einen guten Bildlauf durch, vorausgesetzt myRichTextBox.HideSelection = false;
Philippe
-2

Dies ist eine alte Frage, aber ich hatte dieses Problem und habe das richTextBox_TextChangedEreignis wie oben verwendet, was funktioniert. Ich halte dies jedoch für eine Problemumgehung und wollte die tatsächliche Lösung dokumentieren, falls jemand anderes danach sucht.

Wenn Sie anhängen, wird automatisch gescrollt, das RichTextBoxmuss jedoch fokussiert werden. Rufen Sie also Focusvorher AppendTextan, um sicherzustellen, dass ein automatischer Bildlauf durchgeführt wird.

richTextBox.Focus();

richTextBox.AppendText(text);
DocWho
quelle
Funktioniert auch nicht. Downvoting, um für andere Benutzer besser sichtbar zu sein.
SubjectX