2008-12-20 32 views
27

Trong ứng dụng Biểu mẫu, tôi hiển thị đầu ra nhật ký từ một ứng dụng dòng lệnh chạy dài tạo ra nhiều đầu ra. Tôi bắt đầu chương trình trong nền, và nắm bắt đầu ra của nó và hiện đang hiển thị nó trong một TextBox bằng cách sử dụng AppendText. Tôi thích chỉ hiển thị ví dụ 1000 dòng cuối cùng. Loại bỏ các dòng từ một TextBox là tốn kém, và một TextBox không thực sự cảm thấy giống như cách tiếp cận tốt nhất để hiển thị log lăn.Cách tiếp cận tốt nhất cho Windows Forms đầu ra nhật ký lăn trong TextBox

Bất kỳ ý tưởng nào về Kiểm soát tốt nhất để thực hiện cửa sổ nhật ký cuộn trong Windows Forms?

Trả lời

12

Tôi từng sử dụng hộp danh sách để làm điều này. Bạn chỉ cần xóa dòng đầu tiên nếu số lượng dòng đạt đến, ví dụ: 1000. Nếu dòng nhật ký quá dài, bạn có thể làm cho hộp danh sách rộng hơn một chút (phụ thuộc vào thông tin nhật ký và liệu có thể nắm bắt ý nghĩa từ lần hiển thị đầu tiên không các từ không cuộn ngang) và làm cho thanh cuộn ngang có thể nhìn thấy được.

+1

tôi đã làm như vậy quá. Tùy thuộc vào thứ tự sắp xếp của bạn (chèn mới nhất trên cùng hoặc dưới cùng), bạn có thể làm nổi bật dòng mới nhất quá – faulty

2

Tôi cần làm điều này một lúc trước và Hộp danh sách là giải pháp. Không ai thậm chí sẽ nhận thấy sự khác biệt.

11

chính xác những gì tôi cần. Tôi đã giải quyết nó bằng mã sau giữ mục được thêm lần cuối hiển thị:

delegate void UpdateCCNetWindowDelegate(String msg); 

    private void Message2CCNetOutput(String message) 
    { 
     // Check whether the caller must call an invoke method when making method calls to listBoxCCNetOutput because the caller is 
     // on a different thread than the one the listBoxCCNetOutput control was created on. 
     if (listBoxCCNetOutput.InvokeRequired) 
     { 
      UpdateCCNetWindowDelegate update = new UpdateCCNetWindowDelegate(Message2CCNetOutput); 
      listBoxCCNetOutput.Invoke(update, message); 
     } 
     else 
     { 
      listBoxCCNetOutput.Items.Add(message); 
      if (listBoxCCNetOutput.Items.Count > Program.MaxCCNetOutputLines) 
      { 
       listBoxCCNetOutput.Items.RemoveAt(0); // remove first line 
      } 
      // Make sure the last item is made visible 
      listBoxCCNetOutput.SelectedIndex = listBoxCCNetOutput.Items.Count - 1; 
      listBoxCCNetOutput.ClearSelected(); 
     } 
    } 
+2

Theo nguyên tắc chung, đối với nhật ký lăn, tôi muốn giữ các mục gần đây nhất ở trên cùng. Người dùng có thể bị nhầm lẫn nếu họ đang đọc một dòng tĩnh dường như ở đầu hộp danh sách đột nhiên biến mất. –

7

Có nhu cầu tương tự và đánh giá cao sự trợ giúp này. Đây là một phiên bản được sửa đổi một chút.

Tạo một ListBox:

<ListBox x:Name="lbLog" Background="LightGray"></ListBox> 

Trong các chủ đề chính (ở phần ban đầu của mã), đặt này để lưu trữ một tham chiếu đến thread UI:

Thread m_UIThread; 
.... 
m_UIThread = Thread.CurrentThread; 

Sau đó, đây là phương thức đăng nhập của bạn, có thể gọi từ bất kỳ chủ đề nào:

public void AddToLog(String message)  
{ 
    if (Thread.CurrentThread != m_UIThread) 
    { 
     // Need for invoke if called from a different thread 
     this.Dispatcher.BeginInvoke(
      DispatcherPriority.Normal, (ThreadStart)delegate() 
      { 
       AddToLog(message); 
      }); 
    } 
    else 
    { 
     // add this line at the top of the log 
     lbLog.Items.Insert(0, message); 

     // keep only a few lines in the log 
     while (lbLog.Items.Count > LOG_MAX_LINES) 
     { 
      lbLog.Items.RemoveAt(lbLog.Items.Count-1); 
     } 
    } 
} 
+0

Điều này làm việc tuyệt vời cho tôi. Cảm ơn! –

+1

Các Dispatcher theo dõi thread nó đã được tạo ra trong bạn không cần m_UIThread ... nên thay vì thử nghiệm if (Thread.Current! = M_UIThread) bạn chỉ có thể sử dụng if (! Dispatcher.CheckAccess()) http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.checkaccess.aspx –

3

giải pháp rất đơn giản

Textbox1.Appendtext(<yourtext>) 

cho log lăn như console

+1

Bị bỏ phiếu. Không xóa văn bản cũ bằng giải pháp này. –

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