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.

¿Fue útil?

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 utilizando SearchText
  • 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();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top