Trong ứng dụng WinForm của tôi, tôi có một điều khiển Hộp văn bản nhiều dòng (uiResults) được sử dụng để báo cáo tiến trình trong khi xử lý một số lượng lớn các mục. Sử dụng AppendText hoạt động tuyệt vời để tự động cuộn xuống dưới cùng ở mọi cập nhật, nhưng nếu người dùng cuộn lại để đọc một số dữ liệu cũ hơn, tôi cần phải tắt tính năng tự động ghi. Tôi thà tránh xa các cuộc gọi P/Invoke nếu có thể.Duy trì vị trí cuộn Hộp văn bản trong khi thêm dòng
Có thể phát hiện xem người dùng đã cuộn lại mà không sử dụng P/Invoke chưa? Còn bây giờ, tôi chỉ cần kiểm tra SelectionStart mà làm việc nhưng đòi hỏi người sử dụng để di chuyển dấu mũ từ ngày kết thúc của hộp văn bản để ngăn chặn sự autoscroll:
if(uiResults.SelectionStart == uiResults.Text.Length)
{
uiResults.AppendText(result + Environment.NewLine);
}
vấn đề chính của tôi là khi phụ thêm một chuỗi bằng cách sử dụng bất động sản văn bản, hộp văn bản được cuộn đến đầu. Tôi đã cố gắng giải quyết vấn đề này bằng cách lưu trữ vị trí dấu mũ và đặt lại và cuộn đến sau khi cập nhật, nhưng điều này làm cho dòng hiện tại di chuyển xuống dưới cùng (tất nhiên, vì ScrollToCaret cuộn không quá khoảng cách cần thiết để đưa dấu nháy vào).
[Continued from above]
else
{
int pos = uiResults.SelectionStart;
int len = uiResults.SelectionLength;
uiResults.Text += result + Environment.NewLine;
uiResults.SelectionStart = pos;
uiResults.SelectionLength = len;
uiResults.ScrollToCaret();
}
WM_VSCROLL được kích hoạt khi thanh cuộn dọc được di chuyển và KHÔNG được kích hoạt qua AppendText. Có thông điệp khác để bắt không? –
@Brad Rem. Không hiểu câu hỏi đầy đủ của bạn. Đã cập nhật. –