AutoCompleteBox学习

AutoComplete 自动完成控件学习记录。

 

AutoComplete接受一个可枚举的对象作为其ItemSource。

 

可枚举对象是指实现了IEnumerable接口的对象.如List,Dictionary等。

 

基本用法:

 

List list = new List() { "chongqing", "chengdu", "guangzhou", "hunan", "anhui", "shanxi", "shanghai", "tianjin", "beijin" }; //复杂类型也可以,会调用每个Item的ToString方法,本例匹配 MySilverlight.City //List ss = new List() { new City(){Name="chongqing",Code="023"} }; this.autoCompleteBox.ItemsSource = 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(string search, T item);

 

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 属性时使用此模式。

你可能感兴趣的:(SilverLight学习记录)