Можно ли сделать автозаполнение текстового поля в WPF?
Я нашел образец, в котором используется поле со списком, а треугольник удаляется путем редактирования шаблона стиля.
Есть ли лучшее решение?
Можно ли сделать автозаполнение текстового поля в WPF?
Я нашел образец, в котором используется поле со списком, а треугольник удаляется путем редактирования шаблона стиля.
Есть ли лучшее решение?
Вы можете найти его в WPF Toolkit, который также доступен через NuGet.
В этой статье демонстрируется, как создать текстовое поле, которое может автоматически предлагать элементы во время выполнения на основе входных данных, в данном случае папок на диске. Текстовое поле папки автозаполнения WPF
Также взгляните на это красивое многоразовое текстовое поле автозаполнения WPF, это было для меня очень годный к употреблению.
Nimgoble - это версия, которую я использовал в 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 в WPF на CodePlex.com. Вы можете загрузить и попробовать его на странице https://wpfautocomplete.codeplex.com/.
или вы можете добавить AutoCompleteBox в панель инструментов, щелкнув по нему, а затем выберите элементы, перейдите к компонентам WPF, введите фильтр AutoCompleteBox, который находится в пространстве имен System.Windows.Controls, и просто перетащите его в свой xaml-файл. Это намного проще, чем делать все остальное, поскольку AutoCompleteBox является встроенным элементом управления.
System.Windows.Controls.AutoCompleteBox
не является частью WPF. Вам нужно будет добавить ссылку на WPF Toolkit, чтобы использовать этот элемент управления.
- person Martin Liversage; 29.01.2013
и вот вилка инструментария, который содержит порт на 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 элементов, поэтому он проходит очень быстро.
Если у вас есть небольшое количество значений для автозаполнения, вы можете просто добавить их в 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>
Я удивлен, почему никто не предложил использовать текстовое поле 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;
С помощью автозаполнения вам нужно сделать это в коде позади, потому что по некоторым причинам другие могут объяснить, что это вызывает исключение.