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, ...
...mais
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:
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:
Merci à Matt pour le pointeur à la boîte à outils WPF.
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
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:
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.
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>
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).
Vous pouvez essayer WPF Auto Complete TextBox sur CodePlex ici: https://wpfautocomplete.codeplex.com/