AutoComplete TextBox dans WPF

Est-il possible de faire une zone de texte autocomplete dans WPF?

J’ai trouvé un exemple où une boîte combinée est utilisée et le sortingangle est supprimé en modifiant le modèle de style.

Y a-t-il une meilleure solution?

Vous pouvez en trouver un dans WPF Toolkit , également disponible via NuGet.

Cet article montre comment créer une zone de texte capable de suggérer automatiquement des éléments à l’exécution en fonction des entrées, dans ce cas des dossiers de lecteur de disque. WPB Dossier de saisie semi-automatique

Jetez également un coup d’oeil à cette belle TextBox de remplissage automatique WPF réutilisable , c’était pour moi très utilisable.

Nimgoble’s est la version que j’ai utilisée en 2015. Je pensais que je le mettrais ici car cette question était en tête de liste dans google pour “wpf autocomplete textbox”

  1. Installer le package nuget pour le projet dans Visual Studio

  2. Ajoutez une référence à la bibliothèque dans xaml:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. Créez une zone de texte et liez le comportement de saisie semi-automatique à la List (TestItems):
    behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHO c'est beaucoup plus facile de démarrer et de gérer que les autres options énumérées ci-dessus.

J’ai publié une boîte de texte WPF Auto Complete dans WPF sur CodePlex.com. Vous pouvez le télécharger et l’essayer depuis https://wpfautocomplete.codeplex.com/ .

ou vous pouvez append AutoCompleteBox dans la boîte à outils en cliquant dessus, puis Choisir les éléments, aller aux composants WPF, taper dans le filtre AutoCompleteBox, qui se trouve dans l’espace de noms System.Windows.Controls et le glisser dans votre fichier xaml. C’est beaucoup plus facile que de faire ces autres choses, puisque AutoCompleteBox est un contrôle natif.

et voici le fork de la boîte à outils qui contient le port à 4.O,

https://github.com/jogibear9988/wpftoolkit

ça a très bien fonctionné pour moi.

Je sais que c’est une très vieille question mais je veux append une réponse que j’ai trouvée.

Tout d’abord, vous avez besoin d’un gestionnaire pour votre gestionnaire d’événements TextChanged normal pour la zone de TextBox :

 private bool InProg; internal void TBTextChanged(object sender, TextChangedEventArgs e) { var change = e.Changes.FirstOrDefault(); if ( !InProg ) { InProg = true; var culture = new CultureInfo(CultureInfo.CurrentCulture.Name); var source = ( (TextBox)sender ); if ( ( ( change.AddedLength - change.RemovedLength ) > 0 || source.Text.Length > 0 ) && !DelKeyPressed ) { if ( Files.Where(x => x.IndexOf(source.Text, SsortingngComparison.CurrentCultureIgnoreCase) == 0 ).Count() > 0 ) { var _appendtxt = Files.FirstOrDefault(ap => ( culture.CompareInfo.IndexOf(ap, source.Text, CompareOptions.IgnoreCase) == 0 )); _appendtxt = _appendtxt.Remove(0, change.Offset + 1); source.Text += _appendtxt; source.SelectionStart = change.Offset + 1; source.SelectionLength = source.Text.Length; } } InProg = false; } } 

Faites ensuite un simple gestionnaire PreviewKeyDown :

  private static bool DelKeyPressed; internal static void DelPressed(object sender, KeyEventArgs e) { if ( e.Key == Key.Back ) { DelKeyPressed = true; } else { DelKeyPressed = false; } } 

Dans cet exemple, “Fichiers” est une liste de noms de répertoires créés au démarrage de l’application.

Ensuite, attachez simplement les gestionnaires:

 public class YourClass { public YourClass() { YourTextbox.PreviewKeyDown += DelPressed; YourTextbox.TextChanged += TBTextChanged; } } 

Avec ce que vous choisissez de mettre dans la List sera utilisé pour la boîte de saisie semi-automatique. Ce n’est peut-être pas une bonne option si vous vous attendez à avoir une liste énorme pour la saisie semi-automatique, mais dans mon application, elle ne voit que 20 à 50 éléments, donc elle passe très rapidement.