WPF Toolkit AutoCompletebox Search в фоновом потоке
-
14-10-2019 - |
Вопрос
Я использую WPF Toolkit AutoCoclletebox, что его элементы - это список милионов объектов.
Использует ли AutoCompletebox для поиска фонового потока, и если это не так, как я могу сделать это.
Решение
Нет, он не использует фоновый поток. Вы можете прочитать источник самостоятельно в WPF взял. Анкет Тем не менее, он достаточно гибкий, чтобы позволить вам сделать это самостоятельно в фоновой потоке.
Вы можете использовать этот подход:
- Обрабатывать
Populating
Событие: отмените его и запустите своего фонового работника, используяSearchText
- Когда фоновый работник завершен: установите
ItemsSource
и позвонитьPopulateComplete
В документации MSDN есть полный пример этого:
В этом примере используется асинхронная веб-служба для заполнения автоматических данных, но та же идея применима к поиску очень большого набора данных. Фоновая тема
Обновлять:
Вот полный пример с поиском, который происходит на фоновом потоке. Он включает в себя один секундный сон для имитации длительного поиска:
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();
}
}