2009-09-11 57 views
18

Trong ứng dụng WPF, tôi muốn xây dựng ngăn đầu ra "Tìm trong tệp", trong đó tôi có thể truyền số lượng lớn văn bản mà không cần phân bổ lại bộ nhớ ở mỗi dòng, như TextBox làm.Hộp văn bản đa dạng WPF cho nội dung lớn

WPF TextBox có một thuộc tính Text duy nhất lưu trữ một chuỗi liền kề. Mỗi lần, tôi muốn thêm nội dung, tôi cần phải làm textBox.Text += "New Text", điều đó thật tệ.

Lý tưởng nhất, điều khiển đó là ảo và yêu cầu tối thiểu tài nguyên, chỉ cho các dòng hiển thị.

Tôi đã nghĩ đến việc sử dụng tiêu chuẩn ListBox với số VirtualizingStackPanel, nhưng không cho phép chọn văn bản trên các dòng.

(Tại mỗi dòng mới được thêm, tôi muốn kiểm soát để cập nhật)

Bất kỳ đề xuất nào?

+0

Hãy thử bảng điều khiển ngăn xếp thay vì hộp danh sách –

+1

@Timothy - làm cách nào để cho phép chọn văn bản trên các dòng? –

+4

Đối với những người gặp phải câu hỏi này bởi vì họ nhận thấy hộp văn bản thường xuyên thay đổi (trong trường hợp của tôi chỉ đọc) có đặc điểm rò rỉ bộ nhớ, hãy chắc chắn đặt UndoLimit thành một thứ khác với mặc định là -1. Giá trị mặc định là -1 cho một hộp văn bản sẽ cho phép tăng trưởng không bị hạn chế của lịch sử hoàn tác. – Derrick

Trả lời

17

Nếu bạn không mong đợi nhiều hơn mười nghìn kết quả tìm kiếm trong ứng dụng của mình, một điều khiển TextBlock hoặc TextBox đa nguyên chỉ đọc sẽ đủ cho đến nay.

Lớp TextBox có phương thức AppendText() đủ nhanh cho bạn.

Nếu bạn cần đánh dấu/định dạng văn bản thì có thể bạn muốn sử dụng RichTextBox.

+1

Cảm ơn codymanix, tài liệu MSDN cho biết: Phương pháp AppendText cho phép người dùng thêm văn bản vào nội dung của điều khiển văn bản mà không sử dụng nối văn bản, có thể mang lại hiệu suất tốt hơn khi có nhiều kết nối được yêu cầu. Ngoài ra sau khi xem xét việc triển khai bên trong .NET Reflector, AppendText chính xác là những gì tôi cần. – decasteljau

+2

Có vấn đề về hiệu suất với giải pháp này. : (TextBox mất quá nhiều tài nguyên UI (CPU) khi tràn ngập sự kiểm soát với hàng ngàn dòng. TextBox không phải là ảo và tính toán phức tạp tại mỗi cuộc gọi AppentText(). Tôi nghĩ chúng ta sẽ cần một điều khiển để vẽ lại và bố trí theo cách ảo, như các ItemsControl sẽ làm – decasteljau

+10

Hãy nhớ rằng hộp văn bản có thể được lưu trữ mỗi phụ của bạn để hoàn tác các hoạt động.Bạn có thể muốn thay đổi trường UndoLimit trên hộp văn bản. – Kelly

0

Bạn đã xem xét hoặc thử kiểm soát RichTextBox chưa?

+0

Chúng tôi đã thử, nhưng hiệu suất trở nên tai hại, có lẽ do quá mức cần thiết liên quan đến định dạng chuỗi, mà tôi không cần. – decasteljau

+0

Cảm ơn bạn đã cho tôi biết. @ codymanix của câu trả lời âm thanh hoàn hảo - Tôi không biết điều đó. –

-1

Một StringBuilder, chỉ cần thêm văn bản cho người xây dựng chuỗi và thay vì làm

textBox.Text += moreText; 

làm

myStringBuilder.Append(moreText); 
textBox.Text = myStringBuilder.ToString(); 

này nên chăm sóc của thuật toán Schlemiel the Painter's.

Tất nhiên, người tạo chuỗi phải là thành viên trong lớp của bạn để nó tồn tại trong suốt vòng đời của đối tượng của bạn.

+0

mỗi khi bạn gọi ToString() trên StringBuilder, nó phân bổ một chuỗi tiếp giáp mới chứa các chuỗi được nối. Vì tôi sẽ thêm các dòng mới vào bộ điều khiển mọi lúc, tôi chính xác không muốn điều đó. Đối với mỗi dòng mới, tôi muốn điều khiển cập nhật. – decasteljau

5

Nếu bạn có nội dung thực sự lớn, thì tiếc là tất cả hộp văn bản WPF và các điều khiển tương tự đều rất chậm. Xem this question. Bạn có thể sử dụng AvalonEdit làm phương án thay thế.

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