2012-04-16 36 views
6

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(); 
} 

Trả lời

2

Auto-scrolling text box uses more memory than expected

Mã trong câu hỏi thực hiện chính xác những gì bạn đang tìm kiếm. Văn bản được thêm vào, nhưng việc cuộn chỉ xảy ra nếu thanh cuộn ở phía dưới cùng.

+0

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? –

+0

@Brad Rem. Không hiểu câu hỏi đầy đủ của bạn. Đã cập nhật. –

0

Bạn có mở một cách tiếp cận khác không, bởi vì bạn nhất định gặp rắc rối theo cách này và các giải pháp sẽ phức tạp (v.v. v.v. mà bạn muốn tránh). Ví dụ: giả sử bạn tìm cách "phát hiện xem người dùng đã cuộn lại chưa" và bạn ngừng cuộn xuống dưới cùng. Nhưng sau khi đọc dòng người dùng có thể muốn tính năng cuộn xuống cuối để tiếp tục. Vậy tại sao không cung cấp cho người dùng một cách để điều khiển Tự động cuộn. Đây là cách tôi sẽ làm điều đó ...

Sử dụng một RichTextBox để hiển thị dữ liệu và một Checkbox để kiểm soát AutoScrolling, sau đó mã của bạn có thể là một cái gì đó như thế này:

 richTextBox1.AppendText(result + Environment.NewLine); 
     if (checkBoxAutoScroll.Checked) 
     { 
      richTextBox1.SelectionStart = richTextBox1.Text.Length; 
      richTextBox1.ScrollToCaret(); 
     } 

RichTextBox theo mặc định sẽ không tự động di chuyển đến dưới cùng trên AppendText, do đó, dòng đầu tiên sẽ luôn luôn được hiển thị (và không phải là dòng mới nối thêm). Nhưng nếu người dùng chọn hộp kiểm này có tên là AutoScroll, thì mã của chúng tôi sau đó sẽ cuộn richtextbox xuống dưới cùng, nơi các dòng mới được hiển thị. Nếu người dùng muốn cuộn theo cách thủ công để đọc một dòng, trước tiên, bạn cần phải bỏ chọn hộp kiểm.

+1

Thật không may, nó có vẻ giống như cuộn 'RichTextBox' ở phía dưới khi sử dụng' AppendText' - nhưng chỉ khi điều khiển có tiêu điểm. Nhưng kể từ khi người dùng đôi khi cần phải chọn và sao chép văn bản, cách tiếp cận này đáng buồn sẽ không hoạt động. – Anlo

Các vấn đề liên quan