Автозаполнение TextBox в WPF - PullRequest
49 голосов
/ 04 июня 2009

Можно ли сделать автозаполнение текстового поля в WPF?

Я нашел образец, где используется поле со списком, и треугольник удаляется путем редактирования шаблона стиля.

Есть ли лучшее решение?

Ответы [ 6 ]

34 голосов
/ 19 ноября 2009

Вы можете найти его в WPF Toolkit , который также доступен через NuGet.

В этой статье демонстрируется, как создать текстовое поле, которое может автоматически предлагать элементы во время выполнения на основе ввода, в данном случае папок на диске. Папка автозаполнения WPF TextBox

Также взгляните на этот симпатичный многократно используемый WPF Autocomplete TextBox , он был очень полезен для меня.

12 голосов
/ 24 июля 2015

Nimgoble - это версия, которую я использовал в 2015 году. Думаю, я бы поставил ее здесь, так как этот вопрос был первым в списке в Google для "wpf autocomplete textbox"

  1. Установить пакет nuget для проекта в Visual Studio

  2. Добавить ссылку на библиотеку в xaml:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. Создать текстовое поле и привязать поведение автозаполнения к List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

ИМХО, это намного легче начать и управлять, чем другие опции, перечисленные выше.

8 голосов
/ 29 июля 2014

Я опубликовал текстовое поле автозаполнения WPF в WPF на CodePlex.com. Вы можете скачать и попробовать его с https://wpfautocomplete.codeplex.com/.

4 голосов
/ 19 февраля 2014

и здесь вилка инструментария, которая содержит порт 4.O,

https://github.com/jogibear9988/wpftoolkit

это сработало очень хорошо для меня.

4 голосов
/ 30 ноября 2012

или вы можете добавить AutoCompleteBox в панель инструментов, щелкнув по нему, а затем выберите «Элементы», перейдите в Компоненты WPF, введите фильтр AutoCompleteBox, который находится в пространстве имен System.Windows.Controls, и просто перетащите его в файл xaml. , Это намного проще, чем делать эти другие вещи, так как AutoCompleteBox является нативным элементом управления.

3 голосов
/ 17 января 2017

Я знаю, что это очень старый вопрос, но я хочу добавить ответ, который я придумал.

Сначала вам понадобится обработчик для обычного TextChanged обработчика событий для 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;
                }
            }

Затем создайте простой обработчик PreviewKeyDown:

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

В этом примере «Файлы» - это список имен каталогов, созданных при запуске приложения.

Затем просто прикрепите обработчики:

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

При этом все, что вы выберете для ввода List, будет использовано для поля автозаполнения. Возможно, это не очень хороший вариант, если вы ожидаете, что у вас будет огромный список для автозаполнения, но в моем приложении он видит только 20-50 элементов, поэтому он очень быстро перебирает.

...