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?
c#
winforms
richtextbox
user1158745
quelle
quelle
Antworten:
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(); }
quelle
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();
quelle
ScrollToEnd()
ist in der WinForms-Version keine Methode verfügbar.ScrollToEnd()
System.Windows.Forms.TextBoxBase
die vonRichTextBox
for WinForms geerbt wird .Ich werde es einfach halten:
Setzen Sie die
HideSelection
Eigenschaft 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); }
quelle
[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
quelle
Wenn Sie neue Daten schreiben,
AppendText()
scrollen Sie nicht nach oben und bleiben immer ganz unten.quelle
Dies ist eine alte Frage, aber ich hatte dieses Problem und habe das
richTextBox_TextChanged
Ereignis 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
RichTextBox
muss jedoch fokussiert werden. Rufen Sie alsoFocus
vorherAppendText
an, um sicherzustellen, dass ein automatischer Bildlauf durchgeführt wird.quelle