【问题标题】:AutoComplete TextBox in WPFWPF 中的自动完成文本框
【发布时间】:2010-10-31 08:22:15
【问题描述】:

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

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

有没有更好的解决方案?

【问题讨论】:

标签: wpf textbox autocomplete wpf-controls


【解决方案1】:

您可以在WPF Toolkit 中找到一个,也可以通过 NuGet 获得。

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

也看看这个漂亮的Reusable WPF Autocomplete TextBox,它对我来说非常有用。

【讨论】:

【解决方案2】:

或者您可以通过单击将 AutoCompleteBox 添加到工具箱中,然后选择项目,转到 WPF 组件,输入位于 System.Windows.Controls 命名空间中的过滤器 AutoCompleteBox,然后将其拖到您的 xaml 文件中.这比做这些其他事情要容易得多,因为 AutoCompleteBox 是一个原生控件。

【讨论】:

  • System.Windows.Controls.AutoCompleteBox 不是 WPF 的一部分。您必须添加对 WPF Toolkit 的引用才能使用该控件。
  • @MartinLiversage 我添加了 Visual Studio 2013 的 wpf 工具包。但在工具箱中仍然看不到自动完成框。这是为什么呢?
【解决方案3】:

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

  1. 在 Visual Studio 中为项目安装 nuget 包

  2. 在 xaml 中添加对库的引用:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. 创建一个文本框并将 AutoCompleteBehaviour 绑定到 List<String>(TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

恕我直言,这比上面列出的其他选项更容易上手和管理。

【讨论】:

  • 适用于内联自动完成,但不提供带有选项的下拉列表..
  • @lambinator - 是的,没有下拉菜单。从设计 POV 来看,如果我只有几个项目(比如 stackoverflow.com/a/8333801/345659。如果我要显示的项目太多(谁想滚动很久?)然后我使用这个自动完成文本框。
【解决方案4】:

我知道这是一个非常古老的问题,但我想添加一个我想出的答案。

首先,您需要一个处理程序来处理您的普通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 个项目,因此它的循环速度非常快。

【讨论】:

    【解决方案5】:

    如果您有少量值需要自动完成,您只需将它们添加到 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>
    

    【讨论】:

      【解决方案6】:

      我很惊讶为什么没有人建议使用 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;
      

      使用自动完成,您需要在后面的代码中执行此操作,因为由于某些原因,其他人可能会解释,它会引发异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2010-09-22
        相关资源
        最近更新 更多