在开发应用程序时,经常需要为用户提供快速输入的辅助功能,比如代码编辑器中的自动补全功能。虽然.NET框架没有内置这样的组件,但可以通过一些自定义的控件来实现。本文介绍的自动补全菜单组件,可以轻松地嵌入到任何文本框或富文本框中,为用户提供下拉提示,从而提高输入效率。
这个组件包含多个类,主要类及其功能如下:
AutocompleteMenu组件的一些基本属性包括:
简单用法:
this.autocompleteMenu1 = new AutocompleteMenu();
autocompleteMenu1.Items.Add("示例文本1");
autocompleteMenu1.Items.Add("示例文本2");
this.textBox1.AutoCompleteMenu = autocompleteMenu1;
高级用法:
string[] snippets = {
"if(^)\n{\n}",
"if(^)\n{\n}\nelse\n{\n}",
"for(^;;)\n{\n}",
"while(^)\n{\n}",
"do${\n^}while();",
"switch(^)\n{\n\tcase : break;\n}"
};
private void BuildAutocompleteMenu()
{
var items = new List<AutocompleteItem>();
foreach (var item in snippets)
items.Add(new SnippetAutocompleteItem(item) { ImageIndex = 1 });
autocompleteMenu1.SetAutocompleteItems(items);
}
可以使用以下快捷键:
可以使用自定义控件来显示AutocompleteMenu(如ListView、ListBox、DataGridView、TreeView等)。为此,创建自己的控件(派生自Control)并实现IAutocompleteListView接口。
有时需要菜单显示的不是一组固定的项目,而是根据文本动态变化的。这个任务可以通过以下方式解决:
autocompleteMenu1.SetAutocompleteItems(new DynamicCollection(tb));
...
internal class DynamicCollection : IEnumerable<AutocompleteItem>
{
public IEnumerator<AutocompleteItem> GetEnumerator()
{
return BuildList().GetEnumerator();
}
private IEnumerable<AutocompleteItem> BuildList()
{
var words = new Dictionary<string, string>();
foreach (Match m in Regex.Matches(tb.Text, @"\b\w+\b"))
words[m.Value] = m.Value;
foreach (var word in words.Keys)
yield return new AutocompleteItem(word);
}
}