WPF中的自动完成文本框

WPF中的自动完成文本框,wpf,textbox,autocomplete,wpf-controls,Wpf,Textbox,Autocomplete,Wpf Controls,是否可以在WPF中自动完成文本框 我发现了一个示例,其中使用了组合框,并通过编辑样式模板删除了三角形 有更好的解决方案吗?您可以在中找到,也可以通过NuGet获得 本文演示如何创建一个文本框,该文本框可以在运行时根据输入(在本例中为磁盘驱动器文件夹)自动建议项目。 还可以看看这个漂亮的,它对我来说非常有用。或者您可以通过单击自动完成框将其添加到工具箱中,然后选择项,转到WPF组件,键入位于System.Windows.Controls命名空间上的筛选器自动完成框,然后将其拖动到您的xaml文件

是否可以在WPF中自动完成文本框

我发现了一个示例,其中使用了组合框,并通过编辑样式模板删除了三角形

有更好的解决方案吗?

您可以在中找到,也可以通过NuGet获得

本文演示如何创建一个文本框,该文本框可以在运行时根据输入(在本例中为磁盘驱动器文件夹)自动建议项目。


还可以看看这个漂亮的,它对我来说非常有用。

或者您可以通过单击自动完成框将其添加到工具箱中,然后选择项,转到WPF组件,键入位于System.Windows.Controls命名空间上的筛选器自动完成框,然后将其拖动到您的xaml文件中。这比做其他事情要容易得多,因为AutoCompleteBox是一个本机控件。

在这里,工具箱的fork包含到4.O的端口


这对我来说非常有效。

我在CodePlex.com的WPF中发布了一个WPF自动完成文本框。您可以从下载并试用。

是我在2015年使用的版本。我想我会把它放在这里,因为这个问题是谷歌“wpf自动完成文本框”列表中的第一个问题

  • 在Visual Studio中为项目安装nuget软件包

  • 在xaml中添加对库的引用:
    xmlns:behaviors=“clr命名空间:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete”

  • 创建一个文本框并将自动完成行为绑定到
    列表
    (测试项):


  • 我想这比上面列出的其他选项更容易开始和管理。

    我知道这是一个非常古老的问题,但我想补充一个我已经想到的答案

    首先,您需要为
    文本框
    的正常
    文本更改
    事件处理程序提供一个处理程序:

    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;
        }
      }
    

    使用此选项,您选择放入
    列表中的任何内容都将用于自动完成框。如果您希望有一个庞大的自动完成列表,那么这可能不是一个好的选择,但在我的应用程序中,它只能看到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:

    C#:


    使用Autocomplete时,您需要在代码隐藏中执行,因为出于某些原因,其他人可能会解释,它会引发异常。

    System.Windows.Controls.AutoCompleteBox不是WPF的一部分。您必须添加对的引用才能使用该控件。@我添加了visual studio 2013的wpf工具包。但仍无法在工具箱中看到“自动完成”框。这是为什么?适用于内联自动完成,但不提供带有选项的下拉列表。@lambinator-是-否下拉列表。从设计角度来看,如果我只有几个项目(假设这是GitHub上的WPF工具包的良好开端):
         <WindowsFormsHost  Margin="10" Width="70">
            <wf:TextBox x:Name="textbox1"/>
         </WindowsFormsHost>
    
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    
         AutoCompleteStringCollection stringCollection = new AutoCompleteStringCollection(){"String 1", "String 2", "etc..."};
       
         textbox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
         textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
         textbox1.AutoCompleteCustomSource = stringCollection;