2009-06-04 10 views
45

Est-il possible de créer une saisie semi-automatique de zone de texte dans WPF?Zone de texte saisie semi-automatique dans WPF

J'ai trouvé un exemple dans lequel une zone de liste modifiable est utilisée et le triangle est supprimé en modifiant le modèle de style.

Existe-t-il une meilleure solution?

Répondre

31

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

Cet article explique comment créer une zone de texte qui peut proposer automatiquement des éléments lors de l'exécution en fonction de l'entrée, dans ce cas, des dossiers du lecteur de disque. WPF AutoComplete Folder TextBox

Jetez un oeil à ce joli Reusable WPF Autocomplete TextBox, c'était pour moi très utilisable.

5

ou vous pouvez ajouter le AutoCompleteBox dans la boîte à outils en cliquant dessus, puis choisissez les éléments, allez à composants WPF, tapez le filtre AutoCompleteBox, qui se trouve sur l'espace de noms System.Windows.Controls et faites simplement glisser dans votre xaml fichier. C'est beaucoup plus facile que de faire ces autres choses, car AutoCompleteBox est un contrôle natif.

+12

'System.Windows.Controls.AutoCompleteBox' ne fait pas partie de WPF. Vous devrez ajouter une référence à [WPF Toolkit] (http://wpf.codeplex.com/) pour utiliser ce contrôle. –

+0

@MartinLiversage J'ai ajouté le kit d'outils wpf pour Visual Studio 2013. Mais la boîte automatique n'est pas visible dans la boîte à outils. pourquoi donc? – vigamage

9

Nimgoble's est la version je en 2015. Je pensais que je mettrais ici que cette question était en tête de liste dans google pour « WPF textbox autocomplete »

  1. Installer NuGet package pour le projet dans Visual studio

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

  3. Créer une zone de texte et lier le AutoComplet eBehaviour à List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

à mon humble avis ce qui est beaucoup plus facile de démarrer et gérer que les autres options énumérées ci-dessus.

+3

Fonctionne bien pour la saisie semi-automatique en ligne, mais ne fournit pas de liste déroulante avec des options. – lambinator

+0

@lambinator - oui non dropdown. A partir d'un POV de conception, si je n'ai que quelques éléments (disons <20-50?) Ensuite, je viens d'utiliser une liste déroulante régulière parce que vous pouvez taper de toute façon en avance: http://stackoverflow.com/a/8333801/345659. Si j'ai trop d'éléments à afficher (qui veut faire défiler depuis longtemps?), J'utilise cette zone de saisie semi-automatique. – JumpingJezza

3

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

D'abord, vous avez besoin d'un gestionnaire pour votre gestionnaire d'événements 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; 
       } 
      } 

Ensuite, faire 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, il suffit attach les gestionnaires:

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

Avec ce que vous choisissez de mettre dans le List sera utilisé pour la zone de saisie semi-automatique. Cela peut ne pas être une bonne option si vous vous attendez à avoir une énorme liste pour la saisie semi-automatique, mais dans mon application, il ne voit que 20-50 articles, donc il passe très rapidement.

Questions connexes