是否可以在 WPF 中使文本框自动完成?
我找到了一个示例,其中使用了组合框并通过编辑样式模板删除了三角形。
有更好的解决方案吗?
是否可以在 WPF 中使文本框自动完成?
我找到了一个示例,其中使用了组合框并通过编辑样式模板删除了三角形。
有更好的解决方案吗?
您可以在WPF Toolkit中找到一个,该工具包也可通过 NuGet 获得。
本文演示了如何创建一个文本框,该文本框可以在运行时根据输入自动建议项目,在本例中为磁盘驱动器文件夹。 WPF 自动完成文件夹文本框
还可以看看这个漂亮的Reusable WPF Autocomplete TextBox,它对我来说非常有用。
Nimgoble是我在 2015 年使用的版本。我想我会把它放在这里,因为这个问题是谷歌“wpf 自动完成文本框”列表中的首位
在 Visual Studio 中为项目安装 nuget 包
在 xaml 中添加对库的引用:
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
创建一个文本框并将 AutoCompleteBehaviour 绑定到List<String>
(TestItems):
<TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />
恕我直言,这比上面列出的其他选项更容易上手和管理。
或者您可以通过单击将 AutoCompleteBox 添加到工具箱中,然后单击它,然后选择项目,转到 WPF 组件,键入位于 System.Windows.Controls 命名空间中的过滤器 AutoCompleteBox,然后将其拖到您的 xaml 文件中。这比做这些其他事情要容易得多,因为 AutoCompleteBox 是一个本机控件。
我知道这是一个非常古老的问题,但我想添加一个我想出的答案。
首先,您需要一个处理程序来处理您的正常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.xml 中。打字会调用自动完成,而且你也有下拉菜单。
<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;
使用自动完成,您需要在后面的代码中执行此操作,因为由于某些原因,其他人可能会解释,它会引发异常。