2009-06-04 24 views
45

¿Es posible hacer un autocompletado de cuadro de texto en WPF?AutoComplete TextBox en WPF

Encontré una muestra donde se usa un cuadro combinado y se elimina el triángulo editando la plantilla de estilo.

¿Existe una solución mejor?

Respuesta

31

Puede encontrar uno en el WPF Toolkit, que también está disponible a través de NuGet.

En este artículo se muestra cómo crear un cuadro de texto que puede sugerir automáticamente elementos en tiempo de ejecución en función de la entrada, en este caso, las carpetas de la unidad de disco. WPF AutoComplete Folder TextBox

También eche un vistazo a este agradable Reusable WPF Autocomplete TextBox, fue para mí muy útil.

5

o puede agregar AutoCompleteBox en la caja de herramientas haciendo clic en ella y luego Elegir elementos, vaya a Componentes de WPF, escriba el filtro AutoCompleteBox, que está en el espacio de nombres System.Windows.Controls y simplemente arrastre hacia su xaml archivo. Esto es mucho más fácil que hacer estas otras cosas, ya que AutoCompleteBox es un control nativo.

+12

'System.Windows.Controls.AutoCompleteBox' no es parte de WPF. Deberá agregar una referencia al [WPF Toolkit] (http://wpf.codeplex.com/) para usar ese control. –

+0

@MartinLiversage Agregué el kit de herramientas wpf para visual studio 2013. Pero aún así la caja de autocompletar no se puede ver en la caja de herramientas. ¿porqué es eso? – vigamage

9

Nimgoble's es la versión que utilicé en 2015. El pensamiento lo pondría aquí ya que esta cuestión era la parte superior de la lista en Google de "cuadro de texto de autocompletar WPF"

  1. Instalar Nuget paquete para proyecto en Visual estudio

  2. Añadir una referencia a la biblioteca en el XAML:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. Crear un cuadro de texto y obligar a la AutoComplet eBehaviour a List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

mi humilde opinión, esto es mucho más fácil para empezar y manejar que las otras opciones mencionadas anteriormente.

+3

Funciona bien para autocompletar en línea, pero no proporciona una lista desplegable con opciones .. – lambinator

+0

@lambinator - sí no menú desplegable. Desde un punto de vista de diseño, si tengo solo algunos elementos (digamos <20-50?) Entonces solo uso un combobox normal porque puede escribir de antemano en él de todos modos: http://stackoverflow.com/a/8333801/345659. Si tengo demasiados elementos para mostrar (¿quién quiere desplazarse por edades?), Entonces uso este cuadro de texto de autocompletar. – JumpingJezza

3

Sé que esta es una pregunta muy antigua, pero quiero agregar una respuesta que se me ocurrió.

En primer lugar se necesita un controlador para el controlador de TextChanged evento normal para el TextBox:

private bool InProg; 
internal void TBTextChanged(object sender, TextChangedEventArgs e) 
      { 
      var change = e.Changes.FirstOrDefault(); 
      if (!InProg) 
       { 
       InProg = true; 
       var culture = new CultureInfo(CultureInfo.CurrentCulture.Name); 
       var source = ((TextBox)sender); 
        if (((change.AddedLength - change.RemovedLength) > 0 || source.Text.Length > 0) && !DelKeyPressed) 
         { 
         if (Files.Where(x => x.IndexOf(source.Text, StringComparison.CurrentCultureIgnoreCase) == 0).Count() > 0) 
          { 
          var _appendtxt = Files.FirstOrDefault(ap => (culture.CompareInfo.IndexOf(ap, source.Text, CompareOptions.IgnoreCase) == 0)); 
          _appendtxt = _appendtxt.Remove(0, change.Offset + 1); 
          source.Text += _appendtxt; 
          source.SelectionStart = change.Offset + 1; 
          source.SelectionLength = source.Text.Length; 
          } 
         } 
       InProg = false; 
       } 
      } 

a continuación, hacer un simple PreviewKeyDown manejador:

private static bool DelKeyPressed; 
    internal static void DelPressed(object sender, KeyEventArgs e) 
    { if (e.Key == Key.Back) { DelKeyPressed = true; } else { DelKeyPressed = false; } } 

En este ejemplo "Archivos" es una lista de nombres de directorio creados en el inicio de la aplicación.

Luego Sólo hay que conectar los controladores:

public class YourClass 
    { 
    public YourClass() 
    { 
    YourTextbox.PreviewKeyDown += DelPressed; 
    YourTextbox.TextChanged += TBTextChanged; 
    } 
    } 

Con esto lo que usted elige para poner en el List será utilizado para la caja de autocompletar. Puede que esta no sea una gran opción si esperas tener una enorme lista para la autocompletar, pero en mi aplicación solo ve 20-50 elementos, por lo que se mueve rápidamente.