Điều khiển RichTextBox tự động cuộn đến lựa chọn hiện tại, nếu vùng chọn không bị ẩn. RichTextBox.AppendText(), ngoài việc thêm văn bản, cũng sửa đổi lựa chọn hiện tại, và do đó gián tiếp kích hoạt hành vi "autoscrolling". Lưu ý rằng nếu RichTextBox.HideSelection được đặt thành true, thì lựa chọn sẽ bị ẩn khi điều khiển không được lấy nét; điều này giải thích hành vi bạn đã mô tả, trong đó tính năng tự động kiểm tra chỉ xảy ra khi người dùng nhấp vào kiểm soát. (Do đó cho phép nó tập trung) Để tránh điều này, bạn cần phải làm như sau khi nối văn bản:
- Sao lưu lựa chọn ban đầu
- Không tập trung kiểm soát
- Ẩn lựa chọn (thông qua một thông điệp Windows)
- AppendText
- Khôi phục lựa chọn ban đầu
- Unhide lựa chọn
- Trung lọc kiểm soát
Bạn cũng có thể kiểm tra xem lựa chọn đã ở cuối văn bản hay chưa và cho phép hành vi tự động kiểm tra nếu nó - về cơ bản mô phỏng hành vi của cửa sổ đầu ra của Visual Studio. Ví dụ:
[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();
}
}
Giải pháp của bạn hoạt động như một sự quyến rũ! Tôi đã thử rất nhiều cách tiếp cận khác để ngăn RichTextBox của tôi di chuyển sau khi thực hiện thay đổi định dạng và đây là cách duy nhất hoạt động. Nó có vẻ phức tạp lúc đầu, nhưng nó đã làm việc :) –