Окно "Rich Text" прокручивается вниз, когда к нему записываются новые данные
Моя программа вызывает Java, а затем перенаправляет stdout на RichTextBox
. Моя проблема заключается в том, что вертикальная полоса прокрутки всегда остается в верхней части окна каждый раз, когда записываются данные.
Даже если вы прокрутите страницу вниз, как только будут записаны новые данные, она вернется вверх. Я хотел бы обратное.
Итак, когда записываются новые данные, он остается внизу. Как я могу это сделать?
Ответы
Ответ 1
Да, вы можете использовать метод 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();
}
Ответ 2
RichTextBox будет прокручиваться до конца, если он имеет фокус, и вы используете AppendText для добавления информации. Если вы установите HideSelection на False, он будет сохранять свой выбор, когда он потеряет фокус и будет автоматически прокручиваться.
Я разработал GUI Log Viewer, который использовал метод ниже. Он использовал до полного ядро. Избавьтесь от этого кода и установив HideSelection в False, получив процессор до 1-2%
//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
Ответ 3
[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);
с помощью вышеуказанного метода вы можете прокрутить текстовое поле вниз
Ответ 4
Я сделаю это просто:
Код:
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);
}
Ответ 5
При записи новых данных, если вы используете AppendText()
, он не будет прокручиваться вверх и будет всегда оставаться внизу.
Ответ 6
Залить un défilement progressif par exampleple →
namespace SongTabs
{
public class RichTextBoxAutoScroll
{
protected int LineJump { get; set; }
protected int ActualLine = 1;
Timer Timer { get; set; }
RichTextBox RichTextBox { get; set; }
public RichTextBoxAutoScroll(RichTextBox rtb,int speed,int linejump)
{
this.LineJump = linejump;
this.RichTextBox = rtb;
this.Timer = new Timer();
this.Timer.Interval = speed;
this.Timer.Tick += Timer_Tick;
}
void Timer_Tick(object sender, EventArgs e)
{
RichTextBox.SelectionStart = RichTextBox.GetFirstCharIndexFromLine(ActualLine);
RichTextBox.ScrollToCaret();
ActualLine += LineJump;
}
public void Start()
{
Timer.Start();
}
}
}
Ответ 7
Это старый вопрос, но у меня была эта проблема, и я использовал событие richTextBox_TextChanged
, как указано выше, которое работает. Но я считаю, что это обходное решение и хочет документировать фактическое решение, если кто-то еще его ищет.
Если вы добавите его, будет автоматически прокручиваться, однако RichTextBox
должен быть сфокусирован.
Поэтому вызовите Focus
до AppendText
, чтобы убедиться, что он автоматически прокручивается.
richTextBox.Focus();
richTextBox.AppendText(text);