Можно ли сделать автозаполнение текстового поля в WPF?
Я нашел образец, в котором используется поле со списком, и треугольник удаляется путем редактирования шаблона стиля.
Есть ли лучшее решение?
Можно ли сделать автозаполнение текстового поля в WPF?
Я нашел образец, в котором используется поле со списком, и треугольник удаляется путем редактирования шаблона стиля.
Есть ли лучшее решение?
Вы можете найти его в WPF Toolkit, который также доступен через NuGet.
В этой статье показано, как создать текстовое поле, которое может автоматически указывать элементы во время выполнения на основе ввода, в данном случае, дисковых папок. Текстовая папка автозаполнения WPF
Также взгляните на этот приятный многократный WPF Autocomplete TextBox, он был для меня очень удобным.
Nimgoble's - это версия, которую я использовал в 2015 году. Думал, что я бы сказал, что этот вопрос был вершиной списка в google для "текстового поля автозаполнения wpf",
Установка пакета nuget для проекта в Visual Studio
Добавьте ссылку на библиотеку в xaml: xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
Создайте текстовое поле и привяжите AutoCompleteBehaviour к List<String>
(TestItems): <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}"/>
ИМХО это намного легче начать и управлять, чем другие варианты, перечисленные выше.
Я опубликовал WPF Auto Complete Text Box в WPF на CodePlex.com. Вы можете скачать и попробовать его из https://wpfautocomplete.codeplex.com/.
или вы можете добавить AutoCompleteBox в панель инструментов, щелкнув по нему, а затем выберите "Элементы", перейдите к компонентам WPF, введите фильтр AutoCompleteBox, который находится в пространстве имен System.Windows.Controls и просто перетащите в свой файл xaml, Это намного проще, чем делать эти другие вещи, поскольку AutoCompleteBox является встроенным элементом управления.
и здесь вилка инструментария, в которой содержится порт 4.O,
https://github.com/jogibear9988/wpftoolkit
он работал очень хорошо для меня.
Я знаю, что это очень старый вопрос, но я хочу добавить ответ, который я придумал.
Сначала вам нужен обработчик для вашего обычного обработчика событий 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 элементов, поэтому он циклически проходит очень быстро.