Domanda

sto usando WPF del toolkit AutoCompleteBox che il suo ItemsSource è una lista di Milioni di oggetti.

Se l'uso AutoCompleteBox per la ricerca di un thread in background e se non lo fa come posso rendere al.

È stato utile?

Soluzione

No, non fa uso di un thread in background. È possibile leggere il te stesso di origine nel WPF Tookit . Tuttavia, è abbastanza flessibile per consentire di farlo da soli su un thread in background.

È possibile utilizzare questo metodo:

  • Gestire l'evento Populating: annullarla, e avviare il lavoratore sfondo utilizzando SearchText
  • Quando il lavoratore sfondo è completo: impostare il ItemsSource e call PopulateComplete

C'è un esempio completo di questo nella documentazione di MSDN:

Questo esempio utilizza un servizio Web asincrono per popolare i dati di completamento automatico, ma la stessa idea si applica alla ricerca di un grande insieme di dati. Il thread in background

Aggiornamento:

Ecco un esempio completo con la ricerca che si verificano in un thread in background. Esso comprende un sonno di un secondo per simulare una lunga ricerca:

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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top