我用AvalonEdit:TextEditor
. 我可以为此控件启用快速搜索对话框(例如在 Ctrl-F 上)吗?或者,也许有人有将搜索词转换为 AvalonEdit:TextEditor
文本的代码?
5 回答
关于它的文档不多,但 AvalonEdit 确实有一个内置的SearchPanel类,听起来与您想要的完全一样。甚至还有一个SearchInputHandler类,可以轻松地将其连接到您的编辑器、响应键盘快捷键等。下面是一些将标准搜索逻辑附加到编辑器的示例代码:
myEditor.TextArea.DefaultInputHandler.NestedInputHandlers.Add(new SearchInputHandler(myEditor.TextArea));
这是它的外观截图(取自使用 AvalonEdit的ILSpy )。您可以在右上角看到搜索控件、它支持的搜索选项以及它对匹配结果所做的自动突出显示。
不支持替换...但是如果您只需要搜索,这可能是一个很好的解决方案。
在 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);
}
我最后一次检查它是“否”。您将必须实现自己的搜索/替换功能。
http://community.icsharpcode.net/forums/p/11536/31542.aspx#31542
您可以从这里快速添加查找/替换 - http://www.codeproject.com/Articles/173509/A-Universal-WPF-Find-Replace-Dialog
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);
}
}