Текстове поле прокрутіть донизу, коли до нього записуються нові дані


79

Моя програма викликає Java, а потім перенаправляє stdout на a 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.
Омар

Незважаючи на те, що ця відповідь є більш простим рішенням, відповідь @Prem Kumar Badri нижче працює в цілому краще, оскільки вона не заважає вибору тексту користувача, а також не має дивних питань вертикального вирівнювання
Лео

19

RichTextBox залишатиметься прокрученим до кінця, якщо він має фокус, і ви використовуєте AppendText для додавання інформації. Якщо ви встановите для HideSelection значення False, він буде зберігати свій вибір, коли він втратить фокус і залишатиметься автоматично прокручуваним.

Я розробив графічний інтерфейс Log Viewer, який використовував метод нижче. Він використовувався до повного стрижня. Позбувшись цього коду та встановивши для HideSelection значення False, використання центрального процесора знизилося до 1-2%

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

3
Це для WPF RichTextBox. ScrollToEnd()не є методом, доступним у версії WinForms.
Jeff B

Він успадковує від TextBoxBase, який єScrollToEnd()
DrWu

Я не бачу цього в документації, System.Windows.Forms.TextBoxBaseяка успадковується RichTextBoxдля WinForms.
Jeff B

6
Ах, я дивився не на те. Ви праві. Однак моє рішення було НЕ використовувати це в будь-якому випадку. Я зміг використовувати AppendText та HideSelection для false, щоб отримати набагато ефективніше рішення.
DrWu

1
більше коду більше проблем, це рішення не має коду, і тому, на мій погляд, є більш витонченим
Макс Керролл

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
Дякую. Жоден з інших методів у мене не спрацював. Цей спрацював. З якихось причин, коли текстове поле стало занадто повно, інші методи вже не працювали.
Джеремі

Щиро дякую, що розмістили це! Здається, що з RichTextBox використання інших методів не змушує його прокручуватись до кінця, якщо у вас немає нового рядка в кінці тексту.
Уолтер Бішоп

Це працює і забезпечує кращу продуктивність, ніж ScrollToCaret. Дякую.
Роман

Це працює дуже приємно, оскільки ви можете залишити властивість HideSelection встановленим на true і, таким чином, ви не будете дратувати мерехтіння, коли заміните весь текст у полі більшим текстом.
luci88filter

-2

Це старе запитання, але у мене була така проблема, і я використав richTextBox_TextChangedподію, як зазначено вище, що працює. Але я вважаю, що це обхідний шлях, і я хотів задокументувати фактичне рішення на випадок, якщо хтось інший шукатиме його.

Якщо ви додасте, він буде прокручуватися автоматично, однак його RichTextBoxпотрібно сфокусувати. Тому зателефонуйте Focusперед тим, AppendTextщоб переконатися, що він автоматично прокручується.

richTextBox.Focus();

richTextBox.AppendText(text);

Не працює. Проголосування проти, щоб бути більш помітним для інших користувачів.
SubjectX

-3

При написанні нових даних, якщо ви їх використовуєте, AppendText()звичайно не прокручуйте вгору і завжди залишатиметеся внизу.


4
Неправильно! Він залишається на вибраному Позиції.
jAC

6
AppendText робить автоматичну прокрутку приємно за умови myRichTextBox.HideSelection = false;
Філіпп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.