AvalonEdit :TextEditor 有快速搜索/替换功能吗?

问题描述 投票:0回答:7

我用

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

c# search avalonedit
7个回答
28
投票

关于它的文档不多,但 AvalonEdit 确实有一个内置的 SearchPanel 类,听起来与您想要的完全一样。甚至还有一个 SearchInputHandler 类,可以轻松地将其连接到编辑器、响应键盘快捷键等。以下是一些将标准搜索逻辑附加到编辑器的示例代码:

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

这里是它的屏幕截图(取自使用 AvalonEdit 的 ILSpy)。您可以在右上角看到搜索控件、它支持的搜索选项以及它对匹配结果的自动突出显示。

Searching in ILSpy with SearchPanel

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


25
投票

对于 Avalon Edit 版本 5.0.1.0 及更高版本,只需执行以下操作:

SearchPanel.Install(XTBAvalonEditor);

其中 XTBAvalonEditor 是 WPF AvalonEdit 控件名称。

确保添加此 using 语句:

using ICSharpCode.AvalonEdit.Search;

然后当编辑器获得焦点时,按 CTL-F:您将看到右上角弹出查找控件。


13
投票

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

4
投票

我上次检查的结果是“否”。您必须实现自己的搜索/替换功能。

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

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


4
投票

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

0
投票

就我而言,我找不到

Search.Install(...)
方法,因此我使用以下代码添加搜索功能。

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

可以通过按键盘上的

Ctrl + F
激活搜索框。


0
投票

在代码项目上找到了一个实现,看起来不错:

https://www.codeproject.com/Tips/768408/A-Find-and-Replace-Tool-for-AvalonEdit

并且您可以按需打开文本替换。

<avalonedit:TextEditor SyntaxHighlighting="XML" x:Name="gameListXMLText"  KeyDown="gameListXMLText_KeyDown" />

private void gameListXMLText_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.S && Keyboard.Modifiers == ModifierKeys.Control)
    {
        //this.Close();
    }
    else if (e.Key == Key.H && Keyboard.Modifiers == ModifierKeys.Control)
    {
        FindReplaceDialog.ShowForReplace(gameListXMLText);
    }
}

您也可以保留内置查找:

SearchPanel.Install(this.TextArea);
© www.soinside.com 2019 - 2024. All rights reserved.