WPF del toolkit AutoCompleteBox ricerca su thread in background
-
14-10-2019 - |
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.
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 utilizzandoSearchText
- Quando il lavoratore sfondo è completo: impostare il
ItemsSource
e callPopulateComplete
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();
}
}