2012-11-12 6 views

Antwort

20

Es gibt nicht viel Dokumentation darüber, aber AvalonEdit hat eine in SearchPanel Klasse gebaut, die genau klingt wie das, was Sie wollen. Es gibt sogar eine SearchInputHandler Klasse, die es trivial macht es zu einem Editor angeschlossen zu bekommen, auf Tastatur reagiert Verknüpfungen usw. Hier ist ein Beispielcode, der die Standard-Suchlogik zu einem Editor angehängt:

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

Hier ein Screenshot von dem, wie es aussehen wird (das ist von ILSpy, die AvalonEdit verwendet). Sie sehen das Suchsteuerelement oben rechts, die Suchoptionen, die es unterstützt, und die automatische Hervorhebung der übereinstimmenden Ergebnisse.

Searching in ILSpy with SearchPanel

Es gibt keine Unterstützung für ersetzen ... aber wenn Sie nur die Suche benötigen, kann dies eine gute Lösung sein.

+0

Und für XAML? Es ist nicht möglich? –

+0

Es gibt eine Menge Dinge, von denen ich wünschte, dass sie einfach in XAML verwendet werden könnten, wenn es um AvalonEdit geht. Normalerweise erben wir von TextEditor, um es zu erweitern. In einem meiner Projekte habe ich es sogar "BindableTextEditor" genannt, weil ich nur Hooks hinzugefügt habe, um es einfach zu binden. Ich bin kein XAML-Experte, also gibt es vielleicht einen besseren Weg, dies zu tun (Verhalten?), Aber das ist die Richtung, in die ich gehen würde, wenn Sie dies über XAML steuern wollen. –

+0

Brilliant !!! Vielen Dank! – peter70

2

ICSharpCode.AvalonEdit 4.3.1.9429

Suchen und Highlight Artikel.

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

Betrieb ersetzen:

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

Fügen Sie im TextEditor-Konstruktor im ICSharpCode.AvalonEdit-Projekt SearchPanel.Install hinzu (this.TextArea); und voila, mit ctrl + f öffnet das Suchfenster.

(mit der Leitung von Stephen McDaniel Post (myEditor mit diesem ersetzen) auch funktioniert, aber die Unterstützung für SearchInputHandler entfernt wird)

(funktioniert gut mit AvalonEdit innen AvalonDock mit MVVM)

Von:

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

An:

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

Für Avalon bearbeiten Version 5.0.1.0, gerade dies tun:

SearchPanel.Install(XTBAvalonEditor); 

Wo XTBAvalonEditor ist die WPF AvalonEdit Steuer Namen.

Stellen Sie sicher, diese Anweisung using hinzuzufügen:

using ICSharpCode.AvalonEdit.Search; 

Dann, wenn der Editor den Fokus hat, drücken Sie CTL-F: Sie werden die Fundsteuer Ecke Pop-up in der oberen rechten Hand sehen.

enter image description here

+0

Gibt es noch etwas zu tun? Nachdem ich es auf diese Weise "installiert" habe, erscheint es, wenn ich auf CTRL-F klicke, aber ich kann es nicht eingeben. – Gimly