Est-il possible de faire une saisie automatique de zone de texte dans WPF?
J'ai trouvé un exemple dans lequel une zone de liste déroulante est utilisée et le triangle est supprimé en modifiant le modèle de style.
Y a-t-il une meilleure solution?
Vous pouvez en trouver un dans le WPF Toolkit , qui est également disponible via NuGet.
Cet article explique comment créer une zone de texte qui peut suggérer automatiquement des éléments lors de l'exécution en fonction de l'entrée, dans ce cas, des dossiers du lecteur de disque. Boîte de texte du dossier de saisie semi-automatique WPF
Jetez également un œil à ce Nice Réutilisable WPF Autocomplete TextBox , il était pour moi très utilisable.
Nimgoble's est la version que j'ai utilisée en 2015. Je pensais la mettre ici car cette question était en haut de la liste dans google pour "wpf autocomplete textbox"
Installer le package nuget pour le projet dans Visual Studio
Ajoutez une référence à la bibliothèque dans le xaml:xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;Assembly=WPFTextBoxAutoComplete"
Créez une zone de texte et liez le comportement de saisie semi-automatique à List<String>
(Articles de test):<TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />
À mon humble avis, il est beaucoup plus facile de démarrer et de gérer que les autres options énumérées ci-dessus.
J'ai publié une zone de texte complète automatique WPF dans WPF sur CodePlex.com. Vous pouvez le télécharger et l'essayer sur https://wpfautocomplete.codeplex.com/ .
ou vous pouvez ajouter l'AutoCompleteBox dans la boîte à outils en cliquant dessus, puis choisir les éléments, allez dans Composants WPF, tapez dans le filtre AutoCompleteBox, qui se trouve dans l'espace de noms System.Windows.Controls et faites-le simplement glisser dans votre fichier xaml. C'est beaucoup plus facile que de faire ces autres choses, car l'AutoCompleteBox est un contrôle natif.
et ici la fourche de la boîte à outils qui contient le port vers 4.O,
https://github.com/jogibear9988/wpftoolkit
cela a très bien fonctionné pour moi.
Je sais que c'est une très vieille question, mais je veux ajouter une réponse que j'ai trouvée.
Vous avez d'abord besoin d'un gestionnaire pour votre gestionnaire d'événement TextChanged
normal pour le 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, StringComparison.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;
}
}
Créez 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, "Files" 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 tout ce que vous choisissez de mettre dans le List
sera utilisé pour la boîte de saisie semi-automatique. Cela peut ne pas être une excellente option si vous vous attendez à avoir une énorme liste pour la saisie semi-automatique, mais dans mon application, elle ne voit que 20 à 50 éléments, donc elle passe très rapidement.