AvalonEdit:TextEditor是否具有快速搜索/替换功能?

时间:2012-11-12 13:54:20

标签: c# search avalonedit

我使用AvalonEdit:TextEditor。我可以为此控件启用快速搜索对话框(例如在Ctrl-F上)吗?或者有人将搜索词的代码编入AvalonEdit:TextEditor文本?

5 个答案:

答案 0 :(得分:22)

没有太多关于它的文档,但是AvalonEdit确实有一个内置的SearchPanel类,听起来就像你想要的那样。甚至还有一个SearchInputHandler类,它可以让它连接到你的编辑器,响应键盘快捷键等等。这里有一些示例代码将标准搜索逻辑附加到编辑器:

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

以下是它的外观截图(这取自使用AvalonEdit的ILSpy)。您可以在右上方看到搜索控件,它支持的搜索选项以及自动突出显示匹配结果。

Searching in ILSpy with SearchPanel

没有任何支持替换...但如果您只是需要搜索,这可能是一个很好的解决方案。

答案 1 :(得分:13)

对于Avalon Edit Version 5.0.1.0,只需执行以下操作:

SearchPanel.Install(XTBAvalonEditor);

其中XTBAvalonEditor是WPF AvalonEdit控件名称。

请务必使用以下语句添加此内容:

using ICSharpCode.AvalonEdit.Search;

然后当编辑器有焦点时,按CTL-F:你会在右上角看到查找控件。

enter image description here

答案 2 :(得分:9)

在ICSharpCode.AvalonEdit项目的TextEditor构造函数中,添加SearchPanel.Install(this.TextArea);瞧,使用ctrl + f打开搜索窗口。

(使用Stephen McDaniel发布的帖子(用此替换myEditor)也行,但是对SearchInputHandler的支持正在删除)

(适用于带有MVVM的AvalonDock内的AvalonEdit)

来自:

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

要:

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

答案 3 :(得分:4)

我最后一次检查它是“否”。您必须实现自己的搜索/替换功能。

http://community.icsharpcode.net/forums/p/11536/31542.aspx#31542

您可以从此处快速添加查找/替换 - http://www.codeproject.com/Articles/173509/A-Universal-WPF-Find-Replace-Dialog

答案 4 :(得分:2)

ICSharpCode.AvalonEdit 4.3.1.9429

搜索并突出显示项目。

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

替换操作:

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