Cette autre question SO porte sur une zone de texte de saisie semi-automatique en WPF. Plusieurs personnes ont développé cela, et l'une des réponses données là-bas suggère cet article sur codeproject.
Mais je n'ai pas trouvé de zone de texte de saisie semi-automatique en WPF qui soit comparable à celle de WinForms. L'exemple de codeproject fonctionne plus ou moins, ...
...mais
- il n'est pas structuré en tant que contrôle réutilisable ou DLL. C'est du code que je dois intégrer dans chaque application.
- Cela fonctionne uniquement avec des répertoires. Il n'a pas de propriétés pour définir si la source de saisie semi-automatique est uniquement des répertoires du système de fichiers, ou des fichiers système, ou ....etc. Je pourrais écrire du code pour cela, bien sûr, mais... J'aimerais plutôt utiliser le code déjà écrit par quelqu'un d'autre.
- Il n'a pas de propriétés pour définir la taille de la fenêtre contextuelle, etc.
- il y a une liste déroulante qui présente les complétions possibles. En naviguant dans cette liste, la zone de texte ne change pas. Taper un caractère tout en étant concentré dans la liste ne provoque pas la mise à jour de la zone de texte.
- changer le focus de la liste déroulante ne fait pas disparaître la liste déroulante contextuelle. C'est déroutant.
Donc, ma question :
*Est-ce que quelqu'un a une zone de texte de saisie semi-automatique WPF GRATUITE qui fonctionne, et qui offre une expérience utilisateur de qualité ?*
RÉPONSE
Voici comment je l'ai fait :
.0. obtenir le WPF Toolkit
.1. exécuter le MSI pour le WPF Toolkit
.2. Dans Visual Studio, faites glisser/déposez depuis la boîte à outils - spécifiquement le groupe de visualisation des données - dans le concepteur d'interface utilisateur. Cela ressemble à ceci dans la boîte à outils VS :
Si vous ne voulez pas utiliser le concepteur, créez le xaml à la main. Cela ressemble à ceci :
...où l'espace de noms toolkit est mappé de cette manière :
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
.3. Fournir le code pour 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();
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 le devriez vous attendre. Cela donne une impression professionnelle. Il n'y a aucune des anomalies que le contrôle de codeproject présente. Voici à quoi cela ressemble :
Merci à Matt pour le pointeur vers le toolkit WPF.