Boîte textuelle autocomplète dans WPF
Est-il possible de faire une zone de texte de saisie semi-automatique dans WPF?
j'ai trouvé un exemple où une boîte bascule est utilisée et le triangle est enlevé en éditant le modèle de style.
y a-t-il une meilleure solution?
6 réponses
vous pouvez en trouver un dans le WPF Toolkit , qui est également disponible via NuGet.
cet article montre comment créer une boîte de texte qui peut suggérer automatiquement des éléments à l'exécution sur la base de l'entrée, dans ce cas, les dossiers disque. WPF saisie semi-automatique de Dossier de zone de texte
jetez également un oeil à ce beau réutilisable WPF Autocomplete TextBox , il était pour moi très utilisable.
de Nimgoble est la version que j'ai utilisée en 2015. J'ai pensé que je l'avais mis ici car cette question était en haut de la liste dans google pour "WPF autocomplete textbox"
-
"installez le paquet nuget pour le projet dans Visual Studio
-
ajouter une référence à la bibliothèque dans le xaml:
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
-
créer une boîte de texte et lient L'AutoCompleteBehaviour à
List<String>
(TestItems):
<TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />
IMHO c'est beaucoup plus facile à démarrer et à gérer que les autres options énumérées ci-dessus.
j'ai publié une boîte de texte automatique WPF complète dans WPF à CodePlex.com. Vous pouvez le télécharger et l'essayer à partir de https://wpfautocomplete.codeplex.com / .
ou vous pouvez ajouter L'AutoCompleteBox dans la boîte à outils en cliquant sur elle et ensuite choisir des articles, allez à composants WPF, tapez dans le filtre AutoCompleteBox, qui est sur le système.Windows.Contrôle l'espace de noms et le juste faire glisser dans votre fichier xaml. C'est beaucoup plus facile que de faire ces autres choses, puisque L'AutoCompleteBox est un contrôle natif.
et voici la fourchette de la boîte à outils qui contient le port à 4.O,
https://github.com/jogibear9988/wpftoolkit
ça a très bien marché pour moi .
je sais que c'est une très vieille question, mais je veux ajouter une réponse je suis venu avec.
tout D'abord, vous avez besoin d'un handler pour votre normal TextChanged
event handler 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;
}
}
, Puis faire un simple PreviewKeyDown
gestionnaire:
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.
alors attachez simplement les manipulateurs:
public class YourClass
{
public YourClass()
{
YourTextbox.PreviewKeyDown += DelPressed;
YourTextbox.TextChanged += TBTextChanged;
}
}
avec ceci tout ce que vous choisissez de mettre dans le List
sera utilisé pour la boîte autocomplete. Ce n'est peut-être pas une bonne option si vous prévoyez d'avoir une liste énorme pour l'autocomplete, mais dans mon application, il ne voit que 20-50 articles donc il tourne à travers très rapide.