2012-11-12 16 views

Odpowiedz

20

Nie ma wiele dokumentacji o tym, ale AvalonEdit ma wbudowany SearchPanel klasy, który brzmi dokładnie tak, jak to, co chcesz. Jest nawet SearchInputHandler klasa sprawia, że ​​to banalne, aby ją podłączyć do edytora, odpowiadając na skróty klawiaturowe, itp Oto przykładowy kod, który dołączony standardową logikę wyszukiwarki do edytora:

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

Oto zrzut ekranu pokazujący, jak będzie wyglądał (pochodzi z ILSpy, który używa AvalonEdit). Możesz zobaczyć kontrolkę wyszukiwania w prawym górnym rogu, opcje wyszukiwania, które obsługuje, i automatyczne podświetlanie, jakie ma pasujące wyniki.

Searching in ILSpy with SearchPanel

Nie ma żadnego wsparcia dla zastąpić ... ale jeśli wystarczy szukają, może być doskonałym rozwiązaniem.

+0

A dla XAML? To niemożliwe? –

+0

Jest wiele rzeczy, które chciałbym były łatwe w użyciu w XAML, jeśli chodzi o AvalonEdit. Zwykle kończę dziedziczenie z 'TextEditor', aby go rozszerzyć. W jednym z moich projektów, myślę, że nawet nazwałem go "BindableTextEditor", ponieważ wszystkie dodane zostały haki, aby ułatwić wiązanie. Nie jestem ekspertem XAML, więc być może jest lepszy sposób na zrobienie tego (zachowania?), Ale to jest kierunek, w którym chciałbym wejść, jeśli chcesz kontrolować to poprzez XAML. –

+0

Genialny !!! Dzięki! – peter70

2

ICSharpCode.AvalonEdit 4.3.1.9429

Search i podkreślają pozycję.

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; 
      } 
     } 

Wymień operację:

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

W konstruktorze TextEditor w projekcie ICSharpCode.AvalonEdit dodaj SearchPanel.Install (this.TextArea); i voila, używając ctrl + f otwiera okno wyszukiwania.

(za pomocą linii od słupka Stephena McDaniel (zastąpić myEditor z tego) też działa, ale wsparcie dla SearchInputHandler jest usuwany)

(dobrze współpracuje z AvalonEdit wewnątrz AvalonDock z MVVM)

Skąd:

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

Do:

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

Avalon Edycja wersja 5.0.1.0, po prostu to zrobić:

SearchPanel.Install(XTBAvalonEditor); 

Gdzie XTBAvalonEditor jest nazwą kontrola WPF AvalonEdit.

Upewnij się, aby dodać tę using:

using ICSharpCode.AvalonEdit.Search; 

wtedy, gdy edytor ma ostrość, naciśnij CTL-F: Zobaczysz kontrola znalezisko pojawiają się w prawym górnym rogu.

enter image description here

+0

Czy jest coś oprócz tego? Po "zainstalowaniu" tego w ten sposób pojawia się po kliknięciu CTRL-F, ale nie mogę go wpisać. – Gimly

Powiązane problemy