Окно Rich Text прокручивается вниз, когда в него записываются новые данные - PullRequest
62 голосов
/ 23 февраля 2012

Моя программа вызывает Java, а затем перенаправляет стандартный вывод на RichTextBox. Моя проблема в том, что вертикальная полоса прокрутки всегда остается в верхней части окна каждый раз, когда записываются данные.

Даже если вы прокрутите вниз, после записи новых данных они перейдут наверх. Я бы хотел наоборот.

Таким образом, когда записываются новые данные, они остаются внизу. Как я могу это сделать?

Ответы [ 6 ]

129 голосов
/ 23 февраля 2012

Да, вы можете использовать метод 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();
}
13 голосов
/ 01 февраля 2014

RichTextBox будет прокручиваться до конца, если у него есть фокус, и вы используете AppendText для добавления информации.Если вы установите HideSelection в False, он сохранит свой выбор, когда потеряет фокус, и останется автоматически прокручиваемым.

Я разработал графический интерфейс просмотра журнала, который использовал метод, описанный ниже.Это использовалось до полного поддержания ядра.Избавившись от этого кода и установив для HideSelection значение False, загрузка ЦП снизилась до 1-2%

//Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();
5 голосов
/ 08 мая 2018
    [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);

с помощью вышеуказанного метода вы можете прокрутить текстовое поле вниз

3 голосов
/ 05 апреля 2019

Я сделаю это просто:

  • Установите для свойства 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);
}
0 голосов
/ 18 ноября 2016

Это старый вопрос, но у меня была эта проблема, и я использовал событие richTextBox_TextChanged, как описано выше, которое работает. Но я чувствую, что это обходной путь, и хотел задокументировать фактическое решение на тот случай, если кто-то еще его ищет.

Если вы добавите его, он автоматически прокрутится, однако RichTextBox должен быть сфокусирован. Поэтому звоните Focus до AppendText, чтобы убедиться, что он автоматически прокручивается.

richTextBox.Focus();

richTextBox.AppendText(text);
0 голосов
/ 14 мая 2013

При записи новых данных, если вы используете AppendText(), они не будут прокручиваться вверх и всегда будут оставаться внизу.

...