wpf textbox autocomplete

WPF: AutoComplete TextBox,... otra vez



(5)

Esta otra pregunta SO pregunta acerca de un cuadro de texto de autocompletar en WPF. Varias personas han construido estos, y una de las respuestas dadas sugiere este artículo del proyecto de código .

Pero no he encontrado ningún cuadro de texto de autocompletado de WPF que se compare con el cuadro de texto de autocompletar de WinForms. La muestra del proyecto de código funciona, más o menos, ...

texto alternativo http://i50.tinypic.com/sx2ej5.jpg

...pero

  • no está estructurado como un control reutilizable o DLL. Es un código que necesito incrustar en cada aplicación.
  • Funciona solo con directorios. no tiene propiedades para establecer si el origen de autocompletar es sólo directorios de sistema de archivos, o archivos de sistema de archivos, o ... etc. Podría escribir código para hacer esto, por supuesto, pero ... Prefiero usar el código de otra persona ya escrito.
  • no tiene propiedades para configurar el tamaño emergente, etc.
  • hay un cuadro de lista emergente que presenta las posibles terminaciones. Al navegar por esa lista, el cuadro de texto no cambia. Escribir un carácter mientras se enfoca en el cuadro de lista no hace que el cuadro de texto se actualice.
  • Al navegar por el foco fuera del cuadro de lista, no hace desaparecer el cuadro de lista emergente. Esto es confuso.

Entonces, mi pregunta:

* ¿Alguien tiene un cuadro de texto de Autocompletar de WPF GRATUITO que funciona y proporciona una experiencia de interfaz de usuario de calidad? *

RESPONDER

Así es como lo hice:

.0. obtener el kit de herramientas de WPF

.1. ejecutar el MSI para el WPF Toolkit

.2. Dentro de Visual Studio, arrastre / suelte desde la caja de herramientas, específicamente el grupo de Visualización de datos, en el Diseñador de UI. Se ve así en la caja de herramientas VS:

texto alternativo http://i49.tinypic.com/s12q6x.jpg

Si no desea utilizar el diseñador, cree a mano el xaml. Se parece a esto:

<toolkit:AutoCompleteBox ToolTip="Enter the path of an assembly." x:Name="tbAssembly" Height="27" Width="102" Populating="tbAssembly_Populating" />

... donde el espacio de nombre del kit de herramientas se mapea de esta manera:

xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"

.3. Proporcione el código para el evento Populating . Esto es lo que utilicé:

private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e) { string text = tbAssembly.Text; string dirname = Path.GetDirectoryName(text); if (Directory.Exists(Path.GetDirectoryName(dirname))) { string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly); string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly); var candidates = new List<string>(); Array.ForEach(new String[][] { files, dirs }, (x) => Array.ForEach(x, (y) => { if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase)) candidates.Add(y); })); tbAssembly.ItemsSource = candidates; tbAssembly.PopulateComplete(); } }

Funciona, de la manera que esperarías. Se siente profesional. No hay ninguna de las anomalías que exhibe el control del proyecto de código. Esto es lo que parece:

texto alternativo http://i50.tinypic.com/24qsopy.jpg

Gracias a Matt por el puntero al kit de herramientas de WPF.


Así es como lo hice:

.1. ejecutar el MSI para el WPF Toolkit

.2. Dentro de Visual Studio, arrastre / suelte desde la caja de herramientas, específicamente el grupo de Visualización de datos, en el Diseñador de UI. Se ve así en la caja de herramientas VS:

texto alternativo http://i49.tinypic.com/s12q6x.jpg

O bien, crea a mano el xaml. Se parece a esto:

<toolkit:AutoCompleteBox ToolTip="Enter the path of an assembly." x:Name="tbAssembly" Height="27" Width="102" Populating="tbAssembly_Populating" />

... donde el espacio de nombre del kit de herramientas se mapea de esta manera:

xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"

.3. Proporcione el código para el evento Populating . Esto es lo que utilicé:

private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e) { string text = tbAssembly.Text; string dirname = Path.GetDirectoryName(text); if (Directory.Exists(Path.GetDirectoryName(dirname))) { string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly); string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly); var candidates = new List<string>(); Array.ForEach(new String[][] { files, dirs }, (x) => Array.ForEach(x, (y) => { if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase)) candidates.Add(y); })); tbAssembly.ItemsSource = candidates; tbAssembly.PopulateComplete(); } }

Gracias a Matt por el puntero al kit de herramientas de WPF.



Mindscape también proporciona 3 controles gratuitos, incluido un cuadro de texto de autocompletado de WPF

http://intellibox.codeplex.com/ parece actualizado tan recientemente como el 1 de octubre de 2013 y contiene el control único. Hubiera agregado como comentario la respuesta de Troy, pero no tengo suficientes representantes. Casi lo ignoro por ese comentario.

Ejemplo de uso de la documentación:

<auto:Intellibox ResultsHeight="80" ExplicitlyIncludeColumns="True" Name="lightspeedBox" DisplayedValueBinding="{Binding Product_Name}" SelectedValueBinding="{Binding Product_Id}" DataProvider="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=LinqToEntitiesProvider}" Height="26" Margin="12,26,12,0" VerticalAlignment="Top"> <auto:Intellibox.Columns> <auto:IntelliboxColumn DisplayMemberBinding="{Binding Product_Name}" Width="150" Header="Product Name" /> <auto:IntelliboxColumn DisplayMemberBinding="{Binding Unit_Price}" Width="75" Header="Unit Price" /> <auto:IntelliboxColumn DisplayMemberBinding="{Binding Suppliers.Company_Name}" Width="125" Header="Supplier" /> </auto:Intellibox.Columns> </auto:Intellibox>



Uso el Intellibox en mi proyecto interno. http://intellibox.codeplex.com/

Me parece que es el uso del patrón Proveedor para buscar muy intuitivo.

La respuesta de Rake proporciona un ejemplo de cómo usarlo, y como él señala, ha tenido algún desarrollo a fines del año pasado (aunque esto es bastante después de que lo utilicé por última vez).