Question

J'utilise la boîte à outils WPF AutoCompleteBox que son ItemsSource est une liste des objets d'milions.

Est-ce que l'utilisation de AutoCompleteBox pour la recherche d'un fil de fond et si elle ne comment puis-je le faire à.

Était-ce utile?

La solution

Non, il ne se sert pas d'un fil d'arrière-plan. Vous pouvez lire la même source dans le WPF Tookit. Cependant, il est suffisamment souple pour vous permettre de le faire vous-même sur un fil d'arrière-plan.

Vous pouvez utiliser cette approche:

  • gérer l'événement Populating: l'annuler, et commencez votre travailleur de fond en utilisant SearchText
  • Lorsque le travailleur de fond est terminée: définir la ItemsSource de PopulateComplete et appel

Il y a un exemple complet de ce dans la documentation MSDN:

Cet exemple utilise un service Web asynchrone pour remplir les données de remplissage automatique, 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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top