wpf工具包autocompletebox搜索背景线程
-
14-10-2019 - |
题
我正在使用WPF Toolkit Autocopteretebox,其物品源是数英里对象的列表。
AutoCocteTebox是否用于搜索背景线程,如果不是,我该如何制作。
解决方案
不,它不使用背景线程。您可以自己阅读源 WPF Takeit. 。但是,它足够灵活,可以让您在背景线程上自己进行。
您可以使用此方法:
- 处理
Populating
事件:取消它,然后使用您的背景工人使用SearchText
- 背景工人完成时:设置
ItemsSource
并打电话PopulateComplete
MSDN文档中有一个完整的示例:
该示例使用异步Web服务来填充自动完整数据,但同样的想法适用于搜索非常大的数据集。背景线程
更新:
这是一个完整的示例,在背景线程上进行搜索。它包括一秒钟的睡眠,以模拟长时间的搜索:
private class PopulateInfo
{
public AutoCompleteBox AutoCompleteBox { get; set; }
public string SearchText { get; set; }
public IEnumerable<string> Results { get; set; }
}
private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e)
{
var populateInfo = new PopulateInfo
{
AutoCompleteBox = sender as AutoCompleteBox,
SearchText = (sender as AutoCompleteBox).SearchText,
};
e.Cancel = true;
var ui = TaskScheduler.FromCurrentSynchronizationContext();
var populate = Task.Factory.StartNew<PopulateInfo>(() => Populate(populateInfo));
populate.ContinueWith(task => OnPopulateComplete(task.Result), ui);
}
private PopulateInfo Populate(PopulateInfo populateInfo)
{
var candidates = new string[] {
"Abc",
"Def",
"Ghi",
};
populateInfo.Results = candidates
.Where(candidate => candidate.StartsWith(populateInfo.SearchText, StringComparison.InvariantCultureIgnoreCase))
.ToList();
Thread.Sleep(1000);
return populateInfo;
}
private void OnPopulateComplete(PopulateInfo populateInfo)
{
if (populateInfo.SearchText == populateInfo.AutoCompleteBox.SearchText)
{
populateInfo.AutoCompleteBox.ItemsSource = populateInfo.Results;
populateInfo.AutoCompleteBox.PopulateComplete();
}
}
不隶属于 StackOverflow