Отключение автопрокрутки RichTextBox

Я использую элемент управления RichTextBox для отображения журналов приложений. Я обновляю элемент управления раз в секунду с помощью нескольких вызовов метода RichTextBox :: AppendText. Что меня действительно раздражает, так это то, что курсор продолжает прокручиваться до последней строки текста. Это очень неудобно в ситуации, когда пользователю нужно анализировать логи, которые находятся в начале. Я пробовал следующее решение моей проблемы:

int pos = tb_logs.SelectionStart;
tb_logs.AppendText("log message");
tb_logs.SelectionStart = pos;

Это не затрагивает суть проблемы, потому что контроль периодически перерисовывается, что очень отвлекает. Есть какое-нибудь более чистое решение?


person truthseeker    schedule 07.02.2011    source источник
comment
Это звучит немного странно, потому что дойти до конца нужно где-то явно. Вы уверены, что добавляемый код не устанавливает само выделение до конца?   -  person Felice Pollano    schedule 07.02.2011
comment
Нет, просто AppendText (текст), AppendText (\ t), Appendtext (\ n)   -  person truthseeker    schedule 07.02.2011
comment
Нашел интересную вещь. Автопрокрутка происходит только тогда, когда текстовая область находится в фокусе. После нажатия на текстовую область все идет не так. Если я не нажимаю на него, я могу прокручивать сообщения с помощью полосы прокрутки одновременно с добавлением новых сообщений, и текст не перескакивает.   -  person truthseeker    schedule 07.02.2011
comment
См. Предотвращение автоматической прокрутки в C # RichTextBox, где описывается та же проблема.   -  person SytS    schedule 18.04.2011


Ответы (2)


Если ваша проблема заключается в том, что при добавлении текста журнала «Вертикальная прокрутка» прокручивается вниз, но вы хотите, чтобы он всегда был сверху:

вам нужно добавить обработчики событий в события VScroll, TextChanged и в обработчике событий установить прокрутку вверх

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll;
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll;

private const UInt32 SB_TOP = 0x6;
private const UInt32 WM_VSCROLL = 0x115;

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg,
    IntPtr wParam, IntPtr lParam);

private void HandleRichTextBoxAdjustScroll(Object sender,
    EventArgs e)
{
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero);
}

То же самое можно сделать и с горизонтальной полосой прокрутки. Замените WM_VSCROLL на WM_HSCROLL и SB_TOP на SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114;
private const UInt32 SB_LEFT = 0x06;
person Vijay Sirigiri    schedule 07.02.2011

Вы можете попробовать tb_logs.SelectionLength = 1; вместе с SelectionStart. Это сделает 1 символ выбранным из вашей текущей позиции.

Не пробовал ... Но может сработает

person Protean    schedule 07.02.2011