2009-06-04 21 views
45

Czy możliwe jest automatyczne uzupełnianie pól tekstowych w WPF?AutoComplete TextBox w WPF

Znalazłem próbkę, w której używane jest pole kombi, a trójkąt jest usuwany przez edycję szablonu stylu.

Czy istnieje lepsze rozwiązanie?

Odpowiedz

31

Można go znaleźć w WPF Toolkit, który jest również dostępny za pośrednictwem NuGet.

W tym artykule opisano sposób tworzenia pola tekstowego, które może automatycznie sugerować elementy w czasie wykonywania na podstawie danych wejściowych, w tym przypadku folderów na dysku. WPF AutoComplete Folder TextBox

Spójrz na to ładne Reusable WPF Autocomplete TextBox, to było dla mnie bardzo użyteczne.

5

lub możesz dodać AutoCompleteBox do przybornika, klikając go, a następnie wybierz elementy, przejdź do komponentów WPF, wpisz filtr AutoCompleteBox, który znajduje się w obszarze nazw System.Windows.Controls i po prostu przeciągnij do swojego xaml plik. Jest to o wiele łatwiejsze niż robienie tych innych rzeczy, ponieważ AutoCompleteBox to natywna kontrola.

+12

'System.Windows.Controls.AutoCompleteBox' nie jest częścią WPF. Będziesz musiał dodać odniesienie do [zestawu narzędzi WPF] (http://wpf.codeplex.com/), aby użyć tej kontroli. –

+0

@MartinLiversage Dodałem zestaw narzędzi do wpf do wizualnego studia 2013. Ale wciąż pole auto-uzupełnienia nie jest widoczne w skrzynce narzędziowej. dlaczego? – vigamage

9

Nimgoble's jest wersja Kiedyś w 2015 roku myślałem, że go umieścić tu kwestia ta była na szczycie listy w Google dla „wpf autouzupełniania tekstowym”

  1. Install Nuget pakiet dla projektu w Visual Studio

  2. Dodaj odwołanie do biblioteki w XAML:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. utworzyć pole tekstowe i wiążą AutoComplet eBehaviour do List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHO jest to o wiele łatwiejsze, aby zacząć i zarządzać niż innych opcji wymienionych powyżej.

+3

Działa dobrze dla wbudowanego autouzupełniania, ale nie zawiera rozwijanej listy z opcjami. – lambinator

+0

@lambinator - tak nie ma rozwijanego menu. Z POV projektu, jeśli mam tylko kilka pozycji (powiedzmy <20-50?) Następnie używam zwykłego combobox, ponieważ i tak możesz napisać dalej: http://stackoverflow.com/a/8333801/345659. Jeśli mam zbyt wiele elementów do wyświetlenia (kto chce przewijać przez wieki?), Używam tego pola tekstowego autouzupełniania. – JumpingJezza

3

Wiem, że to bardzo stare pytanie, ale chcę dodać odpowiedź, którą wymyśliłem.

Najpierw trzeba obsługi dla normalnej obsługi TextChanged wydarzeniem dla 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; 
       } 
      } 

Następnie zrobić prosty PreviewKeyDown Handler:

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

W tym przykładzie "Files" to lista nazwy katalogów utworzone podczas uruchamiania aplikacji.

Następnie wystarczy przymocować teleskopowe:

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

Z tego, co wybrać, aby umieścić w List będą wykorzystywane na polu autouzupełniania. To może nie być świetna opcja, jeśli spodziewasz się mieć ogromną listę autouzupełniania, ale w mojej aplikacji widzi tylko 20-50 pozycji, więc przechodzi bardzo szybko.