WPF自动填充文本框

时间:2017-01-17 19:41:12

标签: c# wpf autocomplete textbox

我已经看到这个问题出现在几个论坛和线程中,但我从未见过有人提供代码来解决问题,只是链接到地方以获得可能或可能不值得处理的工具包。

我想对我的工作成果提出一个更新的问题。请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

首先,您需要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项,所以它循环很快。