WPF中的自动完成TextBox

时间:2009-06-04 14:00:08

标签: wpf textbox autocomplete wpf-controls

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

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

有更好的解决方案吗?

8 个答案:

答案 0 :(得分:34)

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

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

另外看看这个漂亮的Reusable WPF Autocomplete TextBox,这对我来说非常实用。

答案 1 :(得分:12)

Nimgoble's是我在2015年使用的版本。我以为我把它放在这里,因为这个问题在google中为“wpf autocomplete textbox”排在首位

  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}" />

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

答案 2 :(得分:8)

我已在CodePlex.com上的WPF中发布了WPF自动完成文本框。您可以从https://wpfautocomplete.codeplex.com/下载并试用它。

答案 3 :(得分:4)

或者您可以通过单击它然后选择项目,转到WPF组件,将AutoCompleteBox添加到工具箱中,在System.Windows.Controls命名空间中键入过滤器AutoCompleteBox,然后只需拖动到您的xaml文件中。这比执行其他操作容易得多,因为AutoCompleteBox是本机控件。

答案 4 :(得分:4)

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

https://github.com/jogibear9988/wpftoolkit

对我来说非常好。

答案 5 :(得分:3)

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

首先,您需要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; } }

在此示例中,“Files”是在应用程序启动时创建的目录名列表。

然后只需附上处理程序:

public class YourClass
  {
  public YourClass()
    {
    YourTextbox.PreviewKeyDown += DelPressed;
    YourTextbox.TextChanged += TBTextChanged;
    }
  }

使用此选项放入List中的任何内容都将用于自动完成框。这可能不是一个很好的选择,如果你希望有一个巨大的自动完成列表,但在我的应用程序中,它只能看到20-50项,所以它循环很快。

答案 6 :(得分:0)

如果要自动完成的值很少,则可以简单地将它们添加到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>

答案 7 :(得分:0)

我很惊讶为什么没人建议使用WinForms文本框。

XAML:

func DeleteFile(filePath string) error {
    if filePath == "" {
        return errors.New("path is empty")
    }
    
    return os.Remove(filePath) // check against this error by the caller
}

也不要忘记Winforms命名空间:

     <WindowsFormsHost  Margin="10" Width="70">
        <wf:TextBox x:Name="textbox1"/>
     </WindowsFormsHost>

C#:

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

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