web-dev-qa-db-ja.com

WPFのオートコンプリートテキストボックス

WPFでテキストボックスをオートコンプリートすることは可能ですか?

コンボボックスを使用し、スタイルテンプレートを編集して三角形を削除するサンプルを見つけました。

より良い解決策はありますか?

51
Sharath

WPF Toolkit で見つけることができます。これはNuGetからも利用できます。

この記事では、入力(この場合はディスクドライブフォルダー)に基づいて実行時にアイテムを自動提案できるテキストボックスを作成する方法をデモします。 WPFオートコンプリートフォルダーテキストボックス

また、このニースをご覧ください 再利用可能なWPFオートコンプリートテキストボックス 、それは私にとって非常に使いやすいものでした。

34

Nimgoble's は2015年に使用したバージョンです。この質問は「wpf autocomplete textbox」のGoogleのリストのトップだったので、ここに置いたと思います

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

私見これは、上記の他のオプションよりも開始と管理がはるかに簡単です。

12
JumpingJezza

CodePlex.comのWPFでWPF Auto Complete Text Boxを公開しました。 https://wpfautocomplete.codeplex.com/ からダウンロードして試すことができます。

8
Deepak Bhardwaj

または、AutoCompleteBoxをクリックしてツールボックスに追加し、[アイテムの選択]、[WPFコンポーネント]に移動して、System.Windows.Controls名前空間にあるフィルターAutoCompleteBoxを入力し、xamlファイルにドラッグするだけです。 AutoCompleteBoxはネイティブコントロールであるため、これはこれらの他のものよりもはるかに簡単です。

4
MelloG

ここでは、ツールキットのフォークには4.Oへのポートが含まれています。

https://github.com/jogibear9988/wpftoolkit

それは私にとって非常にうまくいきました。

4
user2475096

これは非常に古い質問ですが、思いついた答えを追加したいと思います。

まず、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個のアイテムしか表示されないため、非常にすばやく循環します。

3
ARidder101