2012-01-20 25 views
34

Có rất nhiều câu hỏi tương tự trên internet, bao gồm SO, nhưng các giải pháp được đề xuất không hoạt động trong trường hợp của tôi. Kịch bản: có một textbox log trong XAMLHộp văn bản nhiều dòng với cuộn dọc tự động

<TextBox Name="Status" 
      Margin="5" 
      Grid.Column="1" 
      Grid.Row="5" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Width="600" 
      Height="310"/> 

Có nhiều phương pháp trong mã-đằng sau đó làm một số công việc và thêm một số multiline (có lẽ đó là vấn đề?) Thông điệp vào ô này:

private static void DoSomeThings(TextBox textBox) 
{ 
    // do work 
    textBox.AppendText("Work finished\r\n"); // better way than Text += according to msdn 
    // do more 
    textBox.AppendText("One more message\r\n"); 
    ... 
} 

private static void DoSomething2(TextBox textBox) 
{ 
    // same as first method 
} 

Cần cuộn xuống cuối hộp văn bản sau khi tất cả các hành động diễn ra. Đã thử ScrollToEnd(), ScrollToLine, gói textbox vào các giải pháp ScrollViewer, Selection và Caret, đính kèm ScrollToEnd vào TextChanged. Không có công cụ nào trong số này hoạt động, sau khi các đường thực hiện mà chiều cao hộp văn bản tràn vẫn cần phải được cuộn theo cách thủ công. Xin lỗi cho câu hỏi trùng lặp, tôi đoán tôi đang thiếu một số vấn đề nhỏ có thể được giải quyết nhanh chóng bởi một ai đó có tầm nhìn mới về vấn đề này. Cảm ơn trước.

+0

Khi bạn nói bạn cần phải "cuộn xuống [cuối] của [textbos]", bạn có thực sự muốn "di chuyển" như trong "văn bản nối tiếp cuối cùng có thể nhìn thấy hoàn toàn" không? Hay bạn muốn dấu mũ ở cuối hộp văn bản? –

+0

Đầu tiên. Để minh họa ảnh chụp màn hình - bên trái là những gì tôi nhận được, đúng là những gì tôi cần (như cuộn xuống theo cách thủ công): http://i.piccy.info/i7/0c105234c75b7031df050587f72771b4/1-5-3848/56682026/120120114019_6.jpg – Jaded

Trả lời

73

Theo câu hỏi này: TextBox.ScrollToEnd doesn't work when the TextBox is in a non-active tab

Bạn phải tập trung vào hộp văn bản, cập nhật vị trí dấu sót và sau đó di chuyển đến kết thúc:

Status.Focus(); 
Status.CaretIndex = Status.Text.Length; 
Status.ScrollToEnd(); 

EDIT

Ví dụ TextBox:

<TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" 
     AcceptsReturn="True" Name="textBox"/> 
+0

Đã thử điều đó. Caret thực sự là sau khi dòng cuối cùng trong hộp văn bản, nhưng di chuyển đến nó không xảy ra, tôi vẫn nhìn thấy dòng đầu sau khi chạy ứng dụng (xem phần bên trái của hình ảnh trong bình luận ở trên). – Jaded

+1

Tôi đã thêm một ví dụ về hộp văn bản mà tôi đang sử dụng và hoạt động của cuộn. Bạn có thể cần thêm thuộc tính TextWrapping. –

+0

Có vẻ như vấn đề là thực tế là hộp văn bản không có cơ hội để làm mới/vô hiệu hóa chính nó khi các hoạt động được thực hiện sau khi ứng dụng được tải (trong nhà xây dựng trang). Khi tôi đặt logic vào trình xử lý nút và thực thi nó bằng tay, cuộn thực sự hoạt động như một nét duyên dáng. * chỉnh sửa * Nạp + = (người gửi, args) => TestOperations() trong trang ctor đã làm các trick. Cảm ơn vì sự giúp đỡ. Điều duy nhất tôi muốn biết những gì phương pháp tôi có thể thực hiện bằng tay để đạt được hiệu quả tương tự và vẫn để lại mã trong xây dựng trang. – Jaded

2

Cảm ơn! Tôi đã thêm này để nhớ trọng tâm ban đầu:

var oldFocusedElement = FocusManager.GetFocusedElement(this); 

this.textBox.Focus(); 
this.textBox.CaretIndex = this.textBox.Text.Length; 
this.textBox.ScrollToEnd(); 

FocusManager.SetFocusedElement(this, oldFocusedElement); 
12

Nếu bạn làm cho nó thành một điều khiển tùy chỉnh đơn giản thì bạn không cần bất kỳ mã phía sau để làm cuộn.

Nếu bạn sử dụng WPF thì tốt hơn là sử dụng liên kết thay vì chuyển hộp văn bản xung quanh mã phía sau.

+0

+1 Đơn giản hơn nhiều so với các bài viết khác trên cùng một chủ đề Tôi thậm chí chỉ giữ OnTextChanged (...) {base.OnTextChanged (e); ScrollToEnd();} vì ứng dụng đơn giản của tôi là đủ . – NGI