AutoComplete 自动完成控件学习记录。
AutoComplete接受一个可枚举的对象作为其ItemSource。
可枚举对象是指实现了IEnumerable接口的对象.如List,Dictionary等。
基本用法:
List
这样就为AutoCompleteBox指定了ItemSource
输入c会提示
几个重要的参数:
//当输入字符后延迟多少毫秒开始进行匹配,默认0 this.autoCompleteBox.MinimumPopulateDelay = 100; //最小输入的字符长度,当输入大于等于此长度时,才进行匹配,默认1 this.autoCompleteBox.MinimumPrefixLength = 1;
有时我们的数据源不是一开始就是固定的,而是根据用户的输入动态加载的,因此上面的基本用法就不符合要求了。
高级用法,自定义数据源
首先我们要处理AutoCompleteBox填充发生前事件 Populating 事件
如果要对结果进行自定义匹配规则,还需要处理 AutoCompleteBox 的 ItemFilter 事件
//指定义匹配的模式,如果要实现自已的匹配方法,一定要设置为Custom,已预置了约13种方法 this.autoCompleteBox.FilterMode = AutoCompleteFilterMode.Custom; //填充前事件 this.autoCompleteBox.Populating += new opulatingEventHandler(autoCompleteBox_Populating); //自定义处理方法 this.autoCompleteBox.ItemFilter += ItemFilter;
然后在 Populating 事件中处理加载数据源
void autoCompleteBox_Populating(object sender, PopulatingEventArgs e) { e.Cancel = true;//一定要指定已处理此处理,取消此事件 WebClient wc = new WebClient(); wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);//为测试方便,直接写在这里,实际应用要注意多次注册事件的问题 wc.DownloadStringAsync(new Uri("../AutoCompleteBoxItemSourcePage.ashx",UriKind.Relative));//此URL是相对XAP文件的相对路径,而非承载XAP文件页面的相对路径。。。。 }
最后在WebClient下载完成后
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (!e.Cancelled && e.Error == null)//未取消并且未发生异常 { this.autoCompleteBox.ItemsSource = e.Result.Split('|');//为方便直接返回|分隔的字符串,在实际中应用RIA处理较好 this.autoCompleteBox.PopulateComplete();//一定要指定填充完成,可以进行匹配操作,从而自动引发ItemFilter 事件 } }
ItemFilter 原型:
public delegate bool AutoCompleteFilterPredicate
public bool ItemFilter(string search, object item) { //search 就是用户输入的关键字。 //item是就ItemSource中的项,本例是(object(string)),也可以复杂类型,但要求实现IEnumerable接口 //可以根据相应的逻辑再做进一步处理。为提高性能就在填充前对数据源作处理,此处仅为演示。 if (item.ToString().ToLower().Contains(search.ToLower())) { return true;//返回True表示此项匹配,会出现在下拉选框中 } return false; }
-补充:
FilterMode 类型(MSDN):
//None 指定不使用筛选器。将返回所有项。 //StartsWith 指定区分区域性但不区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String..::..StartsWith 方法,并且将 StringComparer..::..CurrentCultureIgnoreCase 指定为字符串比较条件。 //StartsWithCaseSensitive 指定区分区域性且区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String..::..StartsWith 方法,并且将 StringComparer..::..CurrentCulture 指定为字符串比较条件。 //StartsWithOrdinal 指定带序号的不区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String..::..StartsWith 方法,并且将 StringComparer..::..OrdinalIgnoreCase 指定为字符串比较条件。 //StartsWithOrdinalCaseSensitive 指定带序号的区分大小写的筛选器,其中返回的项以指定的文本开头。该筛选器使用 String..::..StartsWith 方法,并且将 StringComparer..::..Ordinal 指定为字符串比较条件。 //Contains 指定区分区域性但不区分大小写的筛选器,其中返回的项包含指定的文本。 //ContainsCaseSensitive 指定区分区域性且区分大小写的筛选器,其中返回的项包含指定的文本。 //ContainsOrdinal 指定带序号的不区分大小写的筛选器,其中返回的项包含指定的文本。 //ContainsOrdinalCaseSensitive 指定带序号的区分大小写的筛选器,其中返回的项包含指定的文本。 //Equals 指定区分区域性但不区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String..::..Equals 方法,并且将 StringComparer..::..CurrentCultureIgnoreCase 指定为搜索比较条件。 //EqualsCaseSensitive 指定区分区域性且区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String..::..Equals 方法,并且将 StringComparer..::..CurrentCulture 指定为字符串比较条件。 //EqualsOrdinal 指定带序号的不区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String..::..Equals 方法,并且将 StringComparer..::..OrdinalIgnoreCase 指定为字符串比较条件。 //EqualsOrdinalCaseSensitive 指定带序号的区分大小写的筛选器,其中返回的项等于指定的文本。该筛选器使用 String..::..Equals 方法,并且将 StringComparer..::..Ordinal 指定为字符串比较条件。 //Custom 指定使用自定义筛选器。在设置了 AutoCompleteBox..::..TextFilter 或 AutoCompleteBox..::..ItemFilter 属性时使用此模式。