Wpf kit de herramientas de búsqueda AutoCompleteBox el subproceso de fondo
-
14-10-2019 - |
Pregunta
Estoy usando WPF kit de herramientas AutoCompleteBox que su ItemsSource es una lista de milions de objetos.
¿El uso AutoCompleteBox para la búsqueda de un subproceso de fondo y si no es así, ¿cómo puedo llegar a.
Solución
No, no utiliza un subproceso de fondo. Puede leer el mismo origen en el WPF Toolkit . Sin embargo, es lo suficientemente flexible como para que pueda hacerlo usted mismo en un subproceso en segundo plano.
Se puede utilizar este enfoque:
- Controle el evento
Populating
: cancelarlo, y comenzar su trabajador de fondo utilizandoSearchText
- Cuando el trabajador de fondo es completa: establecer la llamada y
ItemsSource
PopulateComplete
Hay un ejemplo completo de esto en la documentación de MSDN:
Ese ejemplo se utiliza un servicio web asíncrono para rellenar los datos de autocompletar, pero la misma idea se aplica a la búsqueda de un gran conjunto de datos. El hilo de fondo
Actualización:
Aquí está un ejemplo completo con la búsqueda que ocurre en un subproceso en segundo plano. Incluye un sueño de un segundo para simular una larga búsqueda:
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();
}
}