Противоречивые результаты с richtextbox с ScrollToCaret

Я работаю с RichTextBox в C#. Он существует на вкладке. Когда выбрана страница табуляции, я стремлюсь заполнить RichTextBox и прокрутить до конца. Я пробовал небольшие вариации решений для этого общего вопроса, главным из которых было:

MyRichTextBox.Select(MyRichTextBox.Text.Length, 0);  
MyRichTextBox.ScrollToCaret();  

или:

MyRichTextBox.SelectionStart = MyRichTextBox.Text.Length;  
MyRichTextBox.ScrollToCaret();  

это приводит к непоследовательным результатам, хотя и предсказуемым образом. Он будет чередоваться между прокруткой вниз и прокруткой на одну строку ниже дно. Соответственно иллюстрированный (извините за ссылки, новый пользователь, поэтому я не могу опубликовать изображения):
успешно прокручивается вниз
прокручивается на одну строку ниже нижней
Я удивлен, что ничего не упоминает об этом поведении в моих поисках, и решил спросить, не сталкивался ли кто-нибудь здесь с этим и/или имеет решение в виду. Если уж на то пошло, то, полагаю, я могу пойти с чем-нибудь вроде itsmatt по ответ.

3 ответов


Я сделал некоторые дальнейшие эксперименты с ScrollToCaret, и он просто не в конечном итоге в том же положении каждый раз. Поскольку моя цель ограничена только прокруткой до самого низа, это был хороший кандидат для отправки сообщения WM_VSCROLL (277 или 0x115) в элемент управления с wParam SB_PAGEBOTTOM (7). Это последовательно прокручивается до самого дна точно так, как мне нужно:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_VSCROLL = 277;
private const int SB_PAGEBOTTOM = 7;

public static void ScrollToBottom(RichTextBox MyRichTextBox)
{
    SendMessage(MyRichTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
}

измените это, чтобы соответствовать вашему рабочему коду..

String gotoCaret = "Something on this line.";
int position = textBox.Text.IndexOf(gotoCaret);
MyRichTextBox.SelectionStart = position;
MyRichTextBox.ScrollToCaret();

У меня такая же проблема, я думаю, RTB почти полностью управляется сообщениями Windows, поэтому это звучит немного как кроличий садок. Поэтому я не знаю причины переменного выхода (но у него есть немного вкус ошибки). Я обеспокоен этим RTB.Scrolltocaret мерцающий вывод, но в программе VB. Комплименты за ваше радикальное решение: оно отлично работает.

Если кто-нибудь столкнется с этой аномалией в этой среде программирования, вот код VB

Imports System.Runtime.InteropServices
Public Class Form
<DllImport("user32.dll",CharSet:=CharSet.Auto)> _
Public Shared Function SendMessage( _
ByVal hWnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As Integer
End Function
Const WM_SCROLL = 277
Const SB_PAGEBOTTOM = 7
Sub ScrollToBottom(ByVal RTBName As RichTextBox)
   SendMessage(RTBName.Handle, _
               WM_SCROLL, _
               SB_PAGEBOTTOM, _
               IntPtr.Zero)
End Sub 'then call ScrollToBottom instead of ScrollToCaret