web-dev-qa-db-fra.com

WPF: AutoComplete TextBox, ... encore

Cette autre SO pose des questions sur une zone de texte à saisie semi-automatique dans WPF. Plusieurs personnes l'ont créée, et l'une des réponses qui y est suggérée cet article de projet de code .

Mais je n'ai trouvé aucune zone de texte de saisie semi-automatique WPF comparable à la zone de texte de saisie semi-automatique de WinForms. L'exemple de codeproject fonctionne, en quelque sorte, ...

alt text

...mais

  • il n'est pas structuré comme un contrôle ou une DLL réutilisable. C'est le code que j'ai besoin d'intégrer dans chaque application.
  • Il ne fonctionne qu'avec des répertoires. il n'a pas de propriétés pour définir si la source de saisie semi-automatique est uniquement les répertoires du système de fichiers, ou les fichiers du système de fichiers, ou .... etc. Je pourrais bien sûr écrire du code pour cela, mais ... Je préfère utiliser le code de quelqu'un d'autre déjà écrit.
  • il n'a pas de propriétés pour définir la taille du popup, etc.
  • il y a une liste déroulante qui présente les complétions possibles. Lorsque vous parcourez cette liste, la zone de texte ne change pas. Taper un caractère tout en étant concentré dans la zone de liste ne provoque pas la mise à jour de la zone de texte.
  • le fait de déplacer le focus loin de la zone de liste ne fait pas disparaître la zone de liste contextuelle. Ceci est déroutant.

Donc, ma question:

* Quelqu'un a-t-il une zone de texte de saisie automatique WPF GRATUITE qui fonctionne, et offre une expérience d'interface utilisateur de qualité? *


[~ # ~] réponse [~ # ~]

Voici comment je l'ai fait:

.0. obtenez le WPF Toolkit

.1. exécuter le MSI pour le WPF Toolkit

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

alt text

Si vous ne souhaitez pas utiliser le concepteur, fabriquez à la main le xaml. Cela 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. Fournissez 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();
    }
}

Cela fonctionne, exactement comme vous vous en doutez. Cela semble professionnel. Il n'y a aucune des anomalies que présente le contrôle de projet de code. Voici à quoi ça ressemble:

alt text


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

45
Cheeso

La dernière version de WPF Toolkit inclut un AutoCompleteBox. Il s'agit d'un ensemble gratuit de contrôles de Microsoft, dont certains seront inclus dans .NET 4.

Jeff Wilcox - Présentation de la boîte de saisie semi-automatique

32
Matt Hamilton

Voici comment je l'ai fait:

.1. exécuter le MSI pour le WPF Toolkit

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

alt text

Ou, faites à la main le xaml. Cela 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. Fournissez 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 vers la boîte à outils WPF.

17
Cheeso

Mindscape fournit également un contrôles gratuits y compris une zone de texte de saisie automatique WPF

http://intellibox.codeplex.com/ ne semble avoir été mis à jour 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 représentants. Je l'ai presque ignoré à cause de ce commentaire.

Exemple d'utilisation 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
RationalDev

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

Je trouve que son utilisation du modèle de fournisseur pour la recherche est très intuitive.

La réponse de Rake fournit un exemple de la façon de l'utiliser, et comme il le fait remarquer, il a connu un certain développement à la fin de l'année dernière (bien que ce soit bien après ma dernière utilisation).

2
Troy

Vous pouvez essayer WPF Auto Complete TextBox sur CodePlex ici: https://wpfautocomplete.codeplex.com/

2
Deepak Bhardwaj