Wpf工具包AutoCompleteBox搜索后台线程

Ere*_*rez 8 wpf multithreading autocompletebox

我正在使用WPF工具包AutoCompleteBox,其itemsSource是一个数百万个对象的列表.

AutoCompleteBox是否用于搜索后台线程,如果不是,我该如何进行.

Ric*_*key 13

不,它不使用后台线程.您可以在WPF Tookit中自己阅读源代码.但是,它足够灵活,允许您在后台线程上自己完成.

你可以使用这种方法:

  • 处理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();
    }
}
Run Code Online (Sandbox Code Playgroud)