Non, il n'utilise pas de thread d'arrière-plan. Vous pouvez lire la source vous-même dans le WPF Tookit. Cependant, il est assez flexible pour vous permettre de le faire vous-même sur un fil de fond.
Vous pouvez utiliser cette approche:
- gérer l'événement
Populating
: l'annuler et commencer votre travailleur de fond en utilisant SearchText
- Lorsque le travailleur de fond est terminée: définir la
ItemsSource
et appelez PopulateComplete
Il existe un exemple complet dans la documentation MSDN:
Cet exemple utilise un service Web asynchrone pour remplir les données auto-complet, mais la même idée s'applique à la recherche d'un ensemble de données très volumineux. Le fil de fond
Mise à jour:
Voici un exemple avec la recherche se produisant sur un fil d'arrière-plan. Il comprend un sommeil d'une seconde pour simuler une longue recherche:
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();
}
}
Merci, mais d'une manière ou d'une autre cela n'a pas fonctionné pour moi. Pourquoi ont-ils mis à jour la totalité de ItemsSource et pas seulement la liste déroulante? – Erez
Si vous gérez vous-même l'événement de remplissage, vous n'avez qu'à définir la source Items pour les candidats correspondants. –
Excellente solution! –