在WPF中自动完成文本框
是否有可能在WPF中使文本框自动完成?
我find了一个使用combobox的示例,并通过编辑样式模板来删除三angular形。
有更好的解决scheme吗?
你可以在WPF Toolkit中find一个,也可以通过NuGet获得。
这篇文章演示了如何创build一个文本框,可以在运行时根据input自动build议项目,在这种情况下,磁盘驱动器文件夹。 WPF自动完成文件夹文本框
也看看这个不错的可重用WPF自动完成文本框 ,这对我来说非常有用。
Nimgoble的是我在2015年使用的版本。以为我把它放在这里,因为这个问题是在谷歌列表顶部的“WPF自动完成文本框”
-
在Visual Studio中安装项目的nuget包
-
在xaml中添加对库的引用:
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
-
创build一个文本框并将AutoCompleteBehaviour绑定到
List<String>
(TestItems):
<TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />
恕我直言,这比上面列出的其他选项更容易开始和pipe理。
我已经在CodePlex.com上发布了WPF自动完成文本框WPF。 您可以从https://wpfautocomplete.codeplex.com/下载并尝试。;
或者你可以通过点击它,然后select项目,到WPF组件,键入在System.Windows.Controls命名空间的filterAutoCompleteBox,只需拖动到您的xaml文件中,将AutoCompleteBox添加到工具箱中。 这比做这些其他的东西要容易得多,因为AutoCompleteBox是一个本地控件。
我知道这是一个非常古老的问题,但我想添加一个我已经提出的答案。
首先,您需要TextBox
正常TextChanged
事件处理程序的处理程序:
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; } }
在这个例子中,“Files”是在应用程序启动时创build的目录名称列表。
然后只需附加处理程序:
public class YourClass { public YourClass() { YourTextbox.PreviewKeyDown += DelPressed; YourTextbox.TextChanged += TBTextChanged; } }
无论你select放在List
中将用于自动填充框。 如果您希望自动完成一个巨大的列表,这可能不是一个好的select,但在我的应用程序中,它只能看到20-50个项目,所以它循环很快。