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.

War es hilfreich?

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 mithilfe SearchText
  • Wenn der Hintergrundarbeiter abgeschlossen ist: Setzen Sie die ItemsSource und Ruf an PopulateComplete

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top