2010-02-26 22 views
45

This other SO question pregunta sobre un cuadro de texto de autocompletar en WPF. Varias personas han creado estos, y una de las respuestas dadas sugiere this codeproject article.WPF: cuadro de texto Autocompletar, ... otra vez

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

alt text 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 establecer 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.
  • navegando fuera del cuadro de lista no hace desaparecer el cuadro de lista emergente. Esto es confuso.

Por lo tanto, mi pregunta:

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


RESPUESTA

?

Así es como lo hice:

.0. consiga el WPF Toolkit

.1. ejecute 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. Parece que este en la caja de herramientas VS:

alt text http://i49.tinypic.com/s12q6x.jpg

Si no desea utilizar el diseñador, artesanal, el XAML. Se ve así:


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

... donde el espacio de nombres kit de herramientas se asigna 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 he usado:


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, tal y como era de esperar. Se siente profesional. No hay ninguna de las anomalías que exhibe el control del proyecto de código. Esto es lo que parece:

alt text http://i50.tinypic.com/24qsopy.jpg


Thanks to Matt for the pointer al paquete de herramientas de WPF.

Respuesta

32

La última gota del WPF Toolkit incluye un AutoCompleteBox. Es un conjunto gratuito de controles de Microsoft, algunos de los cuales serán incluidos en .NET 4.

Jeff Wilcox - Introducing the AutoCompleteBox

+0

intrigantes sonidos, Matt. ¿Hay alguna guía o ejemplo sobre el uso de AutoCompleteBox? Encontré la DLL que lo contiene. ¿Qué xmlns uso en XAML? ¿Cómo lo uso realmente? – Cheeso

+0

Tenga en cuenta que el enlace de la entrada del blog Acabo de agregar conversaciones sobre Silverlight, pero AutoCompleteBox también es para WPF. –

+0

WPF Toolkit en CodePlex está muerto, pero hay varias bifurcaciones en GitHub, si alguien necesita eso: [jogibear9988/wpftoolkit] (https://github.com/jogibear9988/wpftoolkit), [WPFToolkit.DataVisualization] (https://github.com/davidalpert/WPFToolkit.DataVisualization), [theonlylawislove/WPFToolkit] (https://github.com/theonlylawislove/WPFToolkit), [jrwren/wpftoolkit] (https://github.com/jrwren/wpftoolkit). – Athari

17

aquí cómo lo hice:

0.1. ejecute 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. Parece que este en la caja de herramientas VS:

alt text http://i49.tinypic.com/s12q6x.jpg

O, artesanal, el XAML. Se ve así:


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

... donde el espacio de nombres kit de herramientas se asigna 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 he usado:


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 para el puntero al conjunto de herramientas de WPF.

2

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

Me parece que es el uso del patrón de 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 la última vez que lo usé).

+1

http://intellibox.codeplex.com/ parece actualizado tan recientemente como el 1 de octubre de 2013 y contiene el control único. (Gracias, Rake) – Cheeso

+0

Sí, no he trabajado en eso por un tiempo, es bueno saber que ha recibido algo de atención desde entonces. ¡Gracias! – Troy

2

Mindscape también proporciona una 3 free controls incluyendo un cuadro de texto de autocompletar WPF

http://intellibox.codeplex.com/ que sí parece actualizada en fecha tan reciente como el 1 Oct 2013 y contiene el control individual. 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> 
2

Usted puede tratar de WPF Auto Cuadro de texto completo en CodePlex aquí: https://wpfautocomplete.codeplex.com/

+2

Veo que este es su proyecto, y se ve bien, pero debe hacer más que solo agregar un enlace aquí. Agregue un código de muestra, instrucciones, muestre por qué es una posible solución para el OP. StackOverflow es esencialmente una wiki de Q & A, por lo que los usuarios esperan ver suficientes detalles en la respuesta para asegurarse de que esa solución les funcione sin ser quitados de este sitio. Por supuesto, dirija a las personas al sitio codeplex para obtener más información. –

+1

Pasé mi mañana revisando autocompletar cuadros de texto que encontré en diferentes lugares en la red. Este es de lejos el mejor, y es el que usaré en mi proyecto. – dlf

Cuestiones relacionadas