Элемент управления RichTextBox автоматически прокручивается до текущего выделения, если выбор не скрыт. RichTextBox.AppendText(), помимо добавления текста, также изменяет текущий выбор и, таким образом, косвенно вызывает поведение «автопрокрутки». Обратите внимание, что если для RichTextBox.HideSelection установлено значение true, выбор будет скрыт, если элемент управления не находится в фокусе; это объясняет описанное вами поведение, когда автопрокрутка происходит только тогда, когда пользователь нажимает на элемент управления. (Тем самым давая ему фокус) Чтобы предотвратить это, вам нужно сделать следующее: при добавлении текста:
- резервного копирования первоначальный выбор
- Unfocus управления
- Скрыть выделение (через сообщение Windows)
- AppendText
- Восстановить первоначальный выбор выбор
- Unhide
- переориентировать управление
Возможно, вы также захотите проверить, находится ли выделение в конце текста и разрешить поведение автопрокрутки, если это так - это по существу эмулирует поведение окна вывода Visual Studio. Например: раствор
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
const int WM_USER = 0x400;
const int EM_HIDESELECTION = WM_USER + 63;
void OnAppend(string text)
{
bool focused = richTextBox1.Focused;
//backup initial selection
int selection = richTextBox1.SelectionStart;
int length = richTextBox1.SelectionLength;
//allow autoscroll if selection is at end of text
bool autoscroll = (selection==richTextBox1.Text.Length);
if (!autoscroll)
{
//shift focus from RichTextBox to some other control
if (focused) textBox1.Focus();
//hide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0);
}
richTextBox1.AppendText(text);
if (!autoscroll)
{
//restore initial selection
richTextBox1.SelectionStart = selection;
richTextBox1.SelectionLength = length;
//unhide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0);
//restore focus to RichTextBox
if(focused) richTextBox1.Focus();
}
}
Ваше решение работает как очарование! Я пробовал так много других подходов, чтобы предотвратить прокрутку RichTextBox после внесения изменений в форматирование, и это было единственное, что сработало. Сначала это казалось запутанным, но это сработало :) –