2009-06-04 17 views
45

È possibile eseguire un completamento automatico della casella di testo in WPF?TextBox con completamento automatico in WPF

Ho trovato un esempio in cui viene utilizzata una casella combinata e il triangolo viene rimosso modificando il modello di stile.

C'è una soluzione migliore?

risposta

31

È possibile trovare uno nello WPF Toolkit, che è anche disponibile tramite NuGet.

Questo articolo illustra come creare una casella di testo che può auto-suggerire gli elementi in fase di esecuzione in base all'input, in questo caso, le cartelle dell'unità disco. WPF AutoComplete Folder TextBox

Anche dare un'occhiata a questo bel Reusable WPF Autocomplete TextBox, era per me molto utilizzabile.

5

oppure puoi aggiungere AutoCompleteBox nella casella degli strumenti facendo clic su di esso e quindi Scegli elementi, vai a Componenti WPF, digita il filtro AutoCompleteBox, che si trova nello spazio dei nomi System.Windows.Controls e trascina semplicemente il tuo xaml file. Questo è molto più facile di fare queste altre cose, dal momento che AutoCompleteBox è un controllo nativo.

+12

'System.Windows.Controls.AutoCompleteBox' non fa parte di WPF. Dovrai aggiungere un riferimento al [WPF Toolkit] (http://wpf.codeplex.com/) per usare quel controllo. –

+0

@MartinLiversage Ho aggiunto il kit di strumenti wpf per visual studio 2013. Tuttavia, la casella di completamento automatico non è visibile nella cassetta degli attrezzi. perché? – vigamage

9

Nimgoble's è la versione che ho usato nel 2015. Il pensiero che avevo messo qui come a questa domanda era in cima alla lista in google per "textbox autocomplete WPF"

  1. Installare NuGet pacchetto per progetto in Visual Studio

  2. Aggiungere un riferimento alla libreria in XAML:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. Creare una casella di testo e legare l'Autocomplet eBehaviour a List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHO questo è molto più facile per iniziare e gestire rispetto alle altre opzioni sopra elencate.

+3

Funziona bene per il completamento automatico in linea, ma non fornisce un elenco a discesa con le opzioni. – lambinator

+0

@lambinator - yes no dropdown. Da un POV di progettazione, se ho solo alcuni elementi (diciamo <20-50?), Quindi uso solo una normale casella combinata perché è possibile digitare avanti in ogni caso: http://stackoverflow.com/a/8333801/345659. Se ho troppi oggetti da mostrare (chi vuole scorrere per secoli?), Allora uso questa casella di testo a completamento automatico. – JumpingJezza

3

So che questa è una domanda molto vecchia ma voglio aggiungere una risposta che ho trovato.

In primo luogo è necessario un gestore per il vostro normale gestore TextChanged evento per il 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; 
       } 
      } 

poi fare una semplice PreviewKeyDown gestore:

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

In questo esempio "File" è un elenco di nomi di directory creati all'avvio dell'applicazione.

Poi basta allegare i gestori:

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

Con questo ciò che si sceglie di mettere in List sarà utilizzato per la casella di completamento automatico. Questo potrebbe non essere una buona opzione se ti aspetti di avere una lista enorme per il completamento automatico, ma nella mia app vede sempre solo 20-50 articoli, quindi scorre molto velocemente.