2012-11-12 29 views

Trả lời

20

Không có nhiều tài liệu về nó, nhưng AvalonEdit làm đã tích hợp sẵn trong SearchPanel lớp đó nghe có vẻ chính xác như những gì bạn muốn. Thậm chí còn có một lớp SearchInputHandler mà làm cho nó tầm thường để có được nó nối với soạn thảo của bạn, ứng phó với các phím tắt, vv Đây là một số mẫu mã mà kèm theo logic tìm kiếm chuẩn cho một biên tập viên:

myEditor.TextArea.DefaultInputHandler.NestedInputHandlers.Add(new SearchInputHandler(myEditor.TextArea)); 

Đây là một ảnh chụp màn hình của nó sẽ trông như thế nào (được lấy từ ILSpy sử dụng AvalonEdit). Bạn có thể thấy điều khiển tìm kiếm ở trên cùng bên phải, các tùy chọn tìm kiếm mà nó hỗ trợ và tính năng tự động đánh dấu tùy chọn đó phù hợp với kết quả phù hợp.

Searching in ILSpy with SearchPanel

Không có bất kỳ sự hỗ trợ cho thay thế ... nhưng nếu bạn chỉ cần tìm kiếm, điều này có thể là một giải pháp tuyệt vời.

+0

Và đối với XAML? Điều đó là không thể? –

+0

Có rất nhiều điều mà tôi mong muốn là dễ sử dụng trong XAML khi nói đến AvalonEdit. Tôi thường kết thúc kế thừa từ 'TextEditor' để mở rộng nó. Trong một trong những dự án của tôi, tôi nghĩ tôi thậm chí còn gọi nó là 'BindableTextEditor' bởi vì tất cả những gì tôi thêm vào đều là móc để dễ ràng buộc. Tôi không phải là một chuyên gia XAML vì vậy có lẽ có một cách tốt hơn để làm điều này (hành vi?) Nhưng đó là hướng tôi muốn đi vào nếu bạn muốn kiểm soát điều này thông qua XAML. –

+0

Brilliant !!! Cảm ơn! – peter70

2

ICSharpCode.AvalonEdit 4.3.1.9429

tìm kiếm và nổi bật mục.

private int lastUsedIndex = 0; 
     public void Find(string searchQuery) 
     { 
      if (string.IsNullOrEmpty(searchQuery)) 
      { 
       lastUsedIndex = 0; 
       return; 
      } 

      string editorText = this.textEditor.Text; 

      if (string.IsNullOrEmpty(editorText)) 
      { 
       lastUsedIndex = 0; 
       return; 
      } 

      if (lastUsedIndex >= searchQuery.Count()) 
      { 
       lastUsedIndex = 0; 
      } 

      int nIndex = editorText.IndexOf(searchQuery, lastUsedIndex); 
      if (nIndex != -1) 
      { 
       var area = this.textEditor.TextArea; 
       this.textEditor.Select(nIndex, searchQuery.Length); 
       lastUsedIndex=nIndex+searchQuery.Length; 
      } 
      else 
      { 
       lastUsedIndex=0; 
      } 
     } 

Thay thế hoạt động:

public void Replace(string s, string replacement, bool selectedonly) 
     { 
      int nIndex = -1; 
      if(selectedonly) 
      { 
       nIndex = textEditor.Text.IndexOf(s, this.textEditor.SelectionStart, this.textEditor.SelectionLength);   
      } 
      else 
      { 
       nIndex = textEditor.Text.IndexOf(s); 
      } 

      if (nIndex != -1) 
      { 
       this.textEditor.Document.Replace(nIndex, s.Length, replacement); 


    this.textEditor.Select(nIndex, replacement.Length); 
     } 
     else 
     { 
      lastSearchIndex = 0; 
      MessageBox.Show(Locale.ReplaceEndReached); 
     } 
    } 
8

Trong công cụ xây dựng TextEditor trong dự án ICSharpCode.AvalonEdit, thêm SearchPanel.Install (this.TextArea); và thì đấy, sử dụng ctrl + f mở cửa sổ tìm kiếm.

(sử dụng dòng từ bài Stephen McDaniel (thay thế myEditor với điều này) cũng làm việc, nhưng sự hỗ trợ cho SearchInputHandler đang được gỡ bỏ)

(hoạt động tốt với AvalonEdit bên AvalonDock với MVVM)

Từ:

public TextEditor() : this(new TextArea()) 
{ 
} 

Để:

public TextEditor() : this(new TextArea()) 
{ 
    SearchPanel.Install(this.TextArea); 
} 
9

Đối với Avalon Chỉnh sửa Phiên bản 5.0.1.0, chỉ cần thực hiện việc này:

SearchPanel.Install(XTBAvalonEditor); 

Trường hợp XTBAvalonEditor là tên điều khiển AvalonEdit của WPF.

Hãy chắc chắn để thêm tuyên bố sử dụng này:

using ICSharpCode.AvalonEdit.Search; 

Sau đó, khi các biên tập viên có tập trung, nhấn CTL-F: Bạn sẽ thấy sự kiểm soát find bật lên trong góc trên bên phải.

enter image description here

+0

Có gì để làm ngoài việc đó không? Sau khi đã "cài đặt" nó theo cách này, nó xuất hiện khi tôi nhấp vào CTRL-F, nhưng tôi không thể gõ vào nó. – Gimly

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