2010-05-13 43 views
9

Có thể chọn nhiều phần văn bản trong một hộp văn bản WPF không? Ví dụ: đối với hộp văn bản chứa chuỗi THIS IS A TEST, tôi muốn có thể làm nổi bật THIS, sau đó giữ Ctrl và đánh dấu TEST mà không bỏ chọn THIS.Làm cách nào để chọn nhiều đoạn văn bản trong hộp văn bản WPF?

Để có một đầu mối trực quan về những gì tôi đang hướng tới, hãy xem this bài viết về tính năng trong Firefox.

Nếu theo mặc định không có cách nào để thực hiện việc này, tôi muốn biết liệu có bất kỳ kiểm soát của bên thứ ba nào được triển khai trong WPF không.

Trả lời

13

TextBox và RichTextBox lớp WPF của không trực tiếp hỗ trợ Cho phép chọn, nhưng như với hầu hết các bộ phận của WPF nó rất dễ dàng để tùy chỉnh RichTextBox hiện của nó để có được khả năng này.

Các bước thực hiện:

  • Tạo một bắt nguồn lớp từ RichTextBox
  • Thêm một "AdditionalRanges" tài sản của loại ObservableCollection<TextRange> mà sẽ chứa tất cả các dãy chọn ngoại trừ TextSelection hiện
  • Override OnPreviewMouseLeftButtonDown: Nếu Ctrl được nhấn, kết hợp TextSelection hiện tại vào thuộc tính "AdditionalRanges" của bạn và xóa lựa chọn, nếu không xóa "AdditionalRanges".
  • Trong hàm tạo, thêm một trình xử lý CollectionChanged vào "AdditionalRanges" sử dụng TextRange.ApplyPropertyValue() để làm cho phạm vi được thêm vào trong bộ sưu tập xuất hiện các phạm vi bị bỏ ẩn và bị xóa xuất hiện bình thường.

Thực hiện của bạn tôi cũng khuyên bạn nên thực hiện một vài thuộc tính hơn cho tiện theo dõi:

  • An "AllRanges" bất động sản kết hợp TextSelection với AdditionalRanges
  • A "Văn bản" bindable sở hữu
  • Thuộc tính "SelectedText" có thể liên kết

Đây là tất cả những điều khá tầm thường để triển khai.

ghi chú cuối cùng:

  • Khi cập nhật AdditionalRanges hoặc máy tính AllRanges, nếu TextSelection trùng lặp một AdditionalRange hiện có, thay thế nó với một loạt kết hợp khác thêm TextSelection vào danh sách.
  • Bạn có thể thêm trình xử lý TextChanged để biết thời điểm cập nhật thuộc tính "Văn bản" và PropertyChangedCallback để biết thời điểm cập nhật FlowDocument
2

Hộp văn bản WPF chuẩn không hỗ trợ hành vi như vậy, thật không may. Vì vậy, cách duy nhất tôi thấy để có được chức năng đó sẽ được thực hiện kiểm soát hộp văn bản của riêng bạn (có thể dựa trên hộp văn bản tiêu chuẩn ControlTemplate).

Chúc mừng, Alex

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