2012-02-23 23 views
48

Chương trình của tôi gọi Java và sau đó chuyển hướng stdout sang RichTextBox. Vấn đề của tôi là thanh cuộn dọc luôn nằm ở đầu hộp mỗi khi dữ liệu được ghi.Hộp văn bản có dạng cuộn ở dưới cùng khi dữ liệu mới được ghi vào đó

Thậm chí nếu bạn cuộn xuống dưới cùng, khi dữ liệu mới đã được viết, nó sẽ chuyển lên trên cùng. Tôi muốn đối diện.

Vì vậy, khi dữ liệu mới được ghi, nó sẽ ở dưới cùng. Tôi có thể làm cái này như thế nào?

+0

Đối với một dự án WPF/XAML, xem [WPF RichTextBox, tự động cuộn đến cuối] (http://stackoverflow.com/q/10308475) –

Trả lời

91

Có, bạn có thể sử dụng phương pháp ScrollToCaret():

// bind this method to its TextChanged event handler: 
// richTextBox.TextChanged += richTextBox_TextChanged; 
private void richTextBox_TextChanged(object sender, EventArgs e) { 
    // set the current caret position to the end 
    richTextBox.SelectionStart = richTextBox.Text.Length; 
    // scroll it automatically 
    richTextBox.ScrollToCaret(); 
} 
+0

I figured it out. vì một số lý do trong VS 2010, tôi đã phải bấm vào hộp văn bản có định dạng, sau đó nhấp vào sự kiện, sau đó tìm TExted thay đổi và liên kết nó với "myrichTextBox_TextChanged". Vì lý do nào đó đã hoạt động. – user1158745

+0

Vì lý do nào đó, Visual Studio 2017 không cung cấp thuộc tính này làm tùy chọn. Điều này có bị phản đối không? – SubjectX

+0

@SubjectX Tài liệu này nói rằng nó vẫn có sẵn trong phiên bản hiện tại của khung .Net. –

-2

Khi ghi dữ liệu mới, nếu bạn sử dụng AppendText() nó wont di chuyển lên và sẽ luôn ở phía dưới.

+3

Sai! Nó vẫn ở vị trí được chọn. – jAC

+4

AppendText tự động cuộn độc đáo cung cấp myRichTextBox.HideSelection = false; – Philippe

11

RichTextBox sẽ vẫn được cuộn đến cuối nếu nó có tiêu điểm và bạn sử dụng AppendText để thêm thông tin. Nếu bạn đặt HideSelection thành False, nó sẽ tiếp tục lựa chọn khi nó mất tiêu điểm và tự động cuộn.

Tôi đã thiết kế GUI của Trình xem nhật ký sử dụng phương pháp bên dưới. Nó sử dụng đến một cốt lõi đầy đủ giữ lên. Bắt thoát khỏi mã này và thiết lập HideSelection False đã sử dụng CPU xuống 1-2%

//Don't use this! 
richTextBox.AppendText(text); 
richTextBox.ScrollToEnd(); 
+0

Đây là dành cho RichTextBox WPF. 'ScrollToEnd()' không phải là một phương thức có sẵn trên phiên bản WinForms. –

+0

Nó kế thừa từ TextBoxBase mà không có 'ScrollToEnd()' – DrWu

+0

Tôi không thấy nó trong tài liệu cho ['System.Windows.Forms.TextBoxBase'] (http://msdn.microsoft.com/en-us/ library/system.windows.forms.textboxbase (v = vs.110) .aspx) được thừa hưởng bởi ['RichTextBox'] (http://msdn.microsoft.com/en-us/library/system.windows. forms.richtextbox (v = vs.110) .aspx) cho WinForms. –

-2

Đổ bỏ phiền não Progressif mệnh dụ =>

namespace SongTabs 
    { 
     public class RichTextBoxAutoScroll 
     { 
      protected int LineJump { get; set; } 
      protected int ActualLine = 1; 
      Timer Timer { get; set; } 
      RichTextBox RichTextBox { get; set; } 
      public RichTextBoxAutoScroll(RichTextBox rtb,int speed,int linejump) 
      { 
       this.LineJump = linejump; 
       this.RichTextBox = rtb; 
       this.Timer = new Timer(); 
       this.Timer.Interval = speed; 
       this.Timer.Tick += Timer_Tick; 
      } 

      void Timer_Tick(object sender, EventArgs e) 
      { 
       RichTextBox.SelectionStart = RichTextBox.GetFirstCharIndexFromLine(ActualLine); 
       RichTextBox.ScrollToCaret(); 
       ActualLine += LineJump; 
      } 
      public void Start() 
      { 
       Timer.Start(); 
      } 
     } 
    } 
-1

Đây là một câu hỏi cũ, nhưng tôi đã gặp sự cố này và tôi đã sử dụng sự kiện richTextBox_TextChanged như trên, hoạt động. Nhưng tôi cảm thấy đây là một giải pháp và muốn ghi lại giải pháp thực tế trong trường hợp ai đó tìm kiếm nó.

Nếu bạn nối nó sẽ tự động cuộn, tuy nhiên, RichTextBox phải được tập trung. Vì vậy, hãy gọi Focus trước AppendText để đảm bảo tự động cuộn.

richTextBox.Focus(); 

richTextBox.AppendText(text); 
+0

Không hoạt động. Downvoting chỉ hiển thị với những người dùng khác. – SubjectX

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