2012-11-12 13 views

risposta

20

non c'è molto documentazione a riguardo, ma AvalonEdit ha un costruito in SearchPanel classe che suona esattamente come quello che vuoi. C'è anche una classe SearchInputHandler che lo rende banale per farlo collegato al vostro editor, rispondendo alle scorciatoie da tastiera, ecc Ecco alcuni esempi di codice che attaccato la logica di ricerca standard per un editore:

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

Ecco uno screenshot di come apparirà (questo è preso da ILSpy che utilizza AvalonEdit). Puoi vedere il controllo di ricerca in alto a destra, le opzioni di ricerca che supporta e l'evidenziazione automatica che fa dei risultati corrispondenti.

Searching in ILSpy with SearchPanel

Non c'è alcun supporto per sostituire ... ma se avete solo bisogno la ricerca, questo può essere una grande soluzione.

+0

E per XAML? Non è possibile? –

+0

Ci sono molte cose che vorrei fossero facili da usare in XAML quando si tratta di AvalonEdit. Di solito finisco per ereditare da TextEditor per estenderlo. In uno dei miei progetti, penso di averlo chiamato anche "BindableTextEditor" perché tutto ciò che ho aggiunto erano ganci per rendere più facile il binding. Non sono un esperto di XAML, quindi forse c'è un modo migliore per farlo (comportamenti?), Ma questa è la direzione in cui vorrei entrare se vuoi controllarlo tramite XAML. –

+0

Brillante !!! Grazie! – peter70

2

ICSharpCode.AvalonEdit 4.3.1.9429

ricerca ed evidenziare oggetto.

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

Sostituire funzionamento:

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

Nel costruttore TextEditor nel progetto ICSharpCode.AvalonEdit, aggiungere SearchPanel.Install (this.TextArea); e voilà, usando ctrl + f si apre la finestra di ricerca.

(utilizzando la linea dal post di Stephen McDaniel (sostituire myEditor con questo) funziona anche, ma il supporto per SearchInputHandler è stato rimosso)

(funziona bene con AvalonEdit all'interno AvalonDock con MVVM)

Da:

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

A:

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

Per Avalon Edit Versione 5.0.1.0, solo fare questo:

SearchPanel.Install(XTBAvalonEditor); 

Dove XTBAvalonEditor è il nome del controllo WPF AvalonEdit.

Assicurarsi di aggiungere questa istruzione using:

using ICSharpCode.AvalonEdit.Search; 

Poi, quando l'editor è attivo, premere CTL-F: vedrete il controllo ritrovamento pop-up in alto a destra.

enter image description here

+0

C'è qualcosa da fare oltre a quello? Dopo averlo "installato" in questo modo, compare quando clicco su CTRL-F, ma non riesco a scriverlo. – Gimly

Problemi correlati