WPF Toolkit AutoCompleteBox -Suche im Hintergrund -Thread
-
14-10-2019 - |
Frage
Ich verwende WPF Toolkit AutoCompleteBox, dass es sich bei der ElementSource um eine Liste von Objekten handelt.
Verwendet die AutoCompleteBox für das Suchen eines Hintergrund -Threads und wenn dies nicht der Fall ist, wie kann ich es schaffen.
Lösung
Nein, es verwendet keinen Hintergrund -Thread. Sie können die Quelle selbst in der lesen WPF nahm. Es ist jedoch flexibel genug, um es auf einem Hintergrund -Thread selbst zu ermöglichen.
Sie können diesen Ansatz verwenden:
- Umgehen
Populating
Ereignis: Stornieren Sie es und starten Sie Ihren Hintergrundarbeiter mithilfeSearchText
- Wenn der Hintergrundarbeiter abgeschlossen ist: Setzen Sie die
ItemsSource
und Ruf anPopulateComplete
In der MSDN -Dokumentation gibt es ein vollständiges Beispiel dafür:
In diesem Beispiel wird ein asynchroner Webdienst verwendet, um die automatischen Daten zu füllen, aber dieselbe Idee gilt für die Suche nach einem sehr großen Datensatz. Der Hintergrund -Thread
Aktualisieren:
Hier ist ein vollständiges Beispiel mit der Suche in einem Hintergrund -Thread. Es enthält einen Ein Sekundenschlaf, um eine lange Suche zu simulieren:
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();
}
}