No, it does not use a background thread. You can read the source yourself in WPF Tookit . However, it is flexible enough so you can do it yourself on the background of the stream.
You can use this approach:
- Handle the
Populating
event: cancel it and start the background worker using SearchText
- When the background is full: set
ItemsSource
and call PopulateComplete
The MSDN documentation has a complete example:
This example uses an asynchronous web service to populate autocomplete data, but the same idea applies to finding a very large dataset. Background thread
Update:
Here is a complete example of a search in the background thread. It includes a one-second sleep to simulate a long search:
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(); } }
Rick sladkey
source share