Автозаполнение TextBox в WPF

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

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

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


person Community    schedule 04.06.2009    source источник
comment
Это хорошее начало. joshsmithonwpf.wordpress. ru / 2007/06/12 /   -  person Daniil Harik    schedule 04.06.2009


Ответы (8)


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

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

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

person Alexander Zwitbaum    schedule 19.11.2009
comment
Набор инструментов WPF теперь можно найти на GitHub: github.com/xceedsoftware/wpftoolkit - person user; 05.02.2020

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

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

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

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

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

person JumpingJezza    schedule 24.07.2015
comment
Хорошо работает для встроенного автозаполнения, но не предоставляет раскрывающийся список с параметрами. - person lambinator; 25.03.2016
comment
@lambinator - да без выпадающего списка. С точки зрения дизайна, если у меня всего несколько элементов (скажем, ‹20-50?), Тогда я просто использую обычное поле со списком, потому что вы все равно можете ввести его заранее: stackoverflow.com/a/8333801/345659. Если у меня слишком много элементов для отображения (кто хочет прокручивать целую вечность?), Я использую это текстовое поле автозаполнения. - person JumpingJezza; 28.03.2016

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

person Deepak Bhardwaj    schedule 29.07.2014

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

person MelloG    schedule 30.11.2012
comment
System.Windows.Controls.AutoCompleteBox не является частью WPF. Вам нужно будет добавить ссылку на WPF Toolkit, чтобы использовать этот элемент управления. - person Martin Liversage; 29.01.2013
comment
@MartinLiversage Я добавил набор инструментов wpf для Visual Studio 2013. Но все же поле автозаполнения не отображается в ящике для инструментов. это почему? - person vigamage; 08.02.2016

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

https://github.com/jogibear9988/wpftoolkit

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

person user2475096    schedule 19.02.2014

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

Сначала вам понадобится обработчик для обычного 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 элементов, поэтому он проходит очень быстро.

person ARidder101    schedule 17.01.2017

Если у вас есть небольшое количество значений для автозаполнения, вы можете просто добавить их в xaml. Ввод вызовет автозаполнение, а также у вас есть раскрывающиеся списки.

<ComboBox Text="{Binding CheckSeconds, UpdateSourceTrigger=PropertyChanged}"
          IsEditable="True">
    <ComboBoxItem Content="60"/>
    <ComboBoxItem Content="120"/>
    <ComboBoxItem Content="180"/>
    <ComboBoxItem Content="300"/>
    <ComboBoxItem Content="900"/>
</ComboBox>
person Jeson Martajaya    schedule 04.12.2019

Я удивлен, почему никто не предложил использовать текстовое поле WinForms.

XAML:

     <WindowsFormsHost  Margin="10" Width="70">
        <wf:TextBox x:Name="textbox1"/>
     </WindowsFormsHost>

Также не забудьте про пространство имен Winforms:

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

C#:

     AutoCompleteStringCollection stringCollection = new AutoCompleteStringCollection(){"String 1", "String 2", "etc..."};
   
     textbox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
     textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
     textbox1.AutoCompleteCustomSource = stringCollection;

С помощью автозаполнения вам нужно сделать это в коде позади, потому что по некоторым причинам другие могут объяснить, что это вызывает исключение.

person JP-Hundhausen    schedule 20.11.2020