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.
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.
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.
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>
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).
vous pouvez essayer WPF Auto Complete TextBox au CodePlex ici: https://wpfautocomplete.codeplex.com/