WPF: AutoComplete TextBox, ... again

Ce autres DONC, la question demande au sujet d'une zone de texte de saisie semi-automatique dans WPF. Plusieurs personnes ont construit ces, et l'une des réponses qui y est donnée suggère cet article de codeprojet .

mais je n'ai pas trouvé de WPF Autocomplete Textbox qui se compare avec la WinForms autocomplete textbox. L'échantillon du projet fonctionne, en quelque sorte ...

alt texte http://i50.tinypic.com/sx2ej5.jpg

...mais

  • il n'est pas structuré comme un re-utilisable de contrôle ou de la DLL. C'est le code que j'ai besoin d'intégrer à chaque application.
  • ne fonctionne qu'avec les répertoires. il n'a pas de propriétés pour définir si la source autocomplete est uniquement des répertoires du système de fichiers, ou des fichiers du système de fichiers, ou ....etc. Je pourrais écrire le code pour faire cela, bien sûr, mais...Je préfère utiliser un autre code déjà écrit.
  • il n'a pas de propriétés pour définir la taille du popup, etc.
  • il y a une liste popup qui présente les complétions possibles. En naviguant dans cette liste, la boîte de texte ne change pas. Taper un caractère tout en étant concentré dans la listbox n'entraîne pas la mise à jour de la textbox.
  • naviguer focus loin de la listbox ne fait pas disparaître la liste popup. Ceci est source de confusion.

alors, mon question:

*quelqu'un aurait-il une GRATUIT WPF zone de texte de saisie semi-automatique qui fonctionne , et fournit une INTERFACE utilisateur de qualité de l'expérience?*


réponse

Voici comment j'ai fait:

.0. obtenir le WPF Toolkit

.1. lancer le MSI pour la boîte à outils WPF

.2. Dans Visual Studio, faites glisser/déposer la boîte à outils - en particulier le groupe de visualisation des données - dans le concepteur de L'interface utilisateur. Il ressemble à cela dans la boîte à outils VS:

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

si vous ne voulez pas utiliser le concepteur, la main-artisanat le xaml. Il ressemble à ceci:


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

...où l'espace de noms de la boîte à outils est mappé way:

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

.3. Fournir le code de l'événement Populating . Voici ce que j'ai utilisé:


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();
    }
}

ça marche, comme on pouvait s'y attendre. Il se sent professionnel. Il n'y a aucune des anomalies que le codeprojet control présente. Voici à quoi ça ressemble:

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


merci à Matt pour le pointeur de la boîte à outils WPF.

45
demandé sur Community 2010-02-26 03:31:12

5 réponses

la plus récente livraison du WPF Toolkit comprend une boîte Autocomplet. Il s'agit d'un ensemble gratuit de contrôles de Microsoft, dont certains seront inclus dans .NET 4.

Jeff Wilcox - l'Introduction de l'AutoCompleteBox

32
répondu Matt Hamilton 2010-02-26 01:30:30

Voici comment je l'ai fait:

.1. lancez le MSI pour la boîte à outils du FPF

.2. Dans Visual Studio, faites glisser/déposer la boîte à outils - en particulier le groupe de visualisation des données - dans le concepteur de L'interface utilisateur. Il ressemble à ceci dans la boîte à outils VS:

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

Ou à la main, de l'artisanat le code xaml. Il ressemble à ceci:


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

...où l'espace de noms de la boîte à outils est mappé de cette façon:

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

.3. Fournir le code de l'événement Populating . Voici ce que j'ai utilisé:


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();
    }
}

merci à Matt pour le pointeur de la boîte à outils WPF.

17
répondu Cheeso 2010-03-04 18:57:37

Mindscape fournit également un 3 contrôles libres y compris un WPF Autocomplete Textbox

http://intellibox.codeplex.com / semble mis à jour aussi récemment que le 1er octobre 2013 et contient le contrôle unique. J'aurais ajouté un commentaire sur la réponse de Troy, mais je n'ai pas assez de rép. J'ai failli l'ignorer à cause de ce commentaire.

exemple d'usage tiré de la documentation:

    <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
répondu RationalDev 2014-05-06 09:07:54

j'utilise l'Intellibox dans mon projet en interne. http://intellibox.codeplex.com/

je trouve que c'est l'utilisation du modèle de fournisseur pour la recherche très intuitive.

Râteau de répondre, en fournit un exemple de comment l'utiliser, et comme il le souligne, il a connu un certain développement en fin d'année dernière (même si c'est bien après que j'ai utilisé la dernière fois).

2
répondu Troy 2014-05-15 04:23:15

vous pouvez essayer WPF Auto Complete TextBox au CodePlex ici: https://wpfautocomplete.codeplex.com/

2
répondu Deepak Bhardwaj 2014-07-29 11:29:41