2010-12-30 9 views

Antwort

13

Nein, es wird kein Hintergrundthread verwendet. Sie können die Quelle selbst in der WPF Tookit lesen. Es ist jedoch flexibel genug, um es Ihnen zu ermöglichen, es in einem Hintergrundthread selbst zu tun.

Sie diesen Ansatz verwenden:

  • Behandeln Sie das Populating Ereignis: abbrechen, und starten Sie Ihren Hintergrund Arbeiter SearchText
  • Verwendung Wenn der Hintergrund Arbeiter abgeschlossen ist: Stellen Sie die ItemsSource und rufen PopulateComplete

Es ist ein komplettes Beispiel dafür in der MSDN-Dokumentation:

Das Beispiel eine asynchrone Web-Service verwendet die automatische Vervollständigung Daten zu füllen, aber die gleiche Idee gilt eine sehr große Datenmenge zu suchen. Der Hintergrund-Thread

Update:

Hier ist ein komplettes Beispiel mit der Suche auf einem Hintergrund-Thread auftreten. Es enthält eine Sekunde Schlaf, 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(); 
    } 
} 
+0

Danke, aber irgendwie hat es nicht für mich funktioniert. Warum haben sie die gesamte ItemsSource und nicht nur die Dropdown-Liste aktualisiert? – Erez

+0

Wenn Sie das Populations-Ereignis selbst bearbeiten, müssen Sie die ItemsSource nur auf die passenden Kandidaten setzen. –

+0

Große Lösung! –