2009-06-04 16 views
45

WPFでテキストボックスのオートコンプリートを行うことはできますか?WPFのTextBoxをオートコンプリートする

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

もっと良い解決策はありますか?

答えて

31

WPF Toolkitにあるものを見つけることができます。これはNuGetでも利用できます。

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

また、この素敵なReusable WPF Autocomplete TextBoxを見てください、それは私にとって非常に役に立ちました。

5

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

+12

'System.Windows.Controls.AutoCompleteBox'はWPFの一部ではありません。そのコントロールを使用するには、[WPF Toolkit](http://wpf.codeplex.com/)への参照を追加する必要があります。 –

+0

@MartinLiversageビジュアルスタジオ2013のwpfツールキットを追加しました。でも、ツールボックスにオートコンプリートボックスは表示されません。何故ですか? – vigamage

9

Nimgoble'sは、Visualでプロジェクトのnugetパッケージをインストール

  1. 私は2015年思想で使用されるバージョンこの質問は、「WPFオートコンプリートテキストボックス」をGoogleでリストのトップだったので、私はここでそれを置くところでありますメーカー

  2. XAMLでライブラリへの参照を追加します。AutoCompletを
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. テキストボックスを作成してバインドList<String>(TestItems)にeBehaviour:
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHOこれを起動して、上記の他のオプションよりも管理を取得する方がはるかに簡単です。

+3

インラインオートコンプリートでうまく動作しますが、オプション付きのドロップダウンリストは表示されません。 – lambinator

+0

@lambinator - はいいいえドロップダウン。デザインPOVから、私はちょうどいくつかの項目を持っているなら(20-50?と言う)、私はちょうどその前に入力することができるので、通常のコンボボックスを使用します:http://stackoverflow.com/a/8333801/345659。あまりにも多くのアイテムを表示すると(誰が年齢をスクロールしたいのですか?)、このオートコンプリートテキストボックスを使用します。 – JumpingJezza

3

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

まずあなたがTextBoxのためのあなたの通常のTextChangedイベントハンドラのハンドラを必要とする:

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個のアイテムしか見られません。