web-dev-qa-db-ja.com

WPF:AutoComplete TextBox、...再び

この他のSO question はWPFのオートコンプリートテキストボックスについて質問します。数人がこれらを作成しました。 このコードプロジェクトの記事

しかし、WinFormsのオートコンプリートテキストボックスと比較できるWPFオートコンプリートテキストボックスは見つかりませんでした。コードプロジェクトのサンプルは、動作します...

alt text

...だが

  • 再利用可能なコントロールまたはDLLとして構造化されていません。すべてのアプリに埋め込む必要があるコードです。
  • ディレクトリでのみ機能します。オートコンプリートのソースがファイルシステムディレクトリのみか、ファイルシステムファイルか.... etcかを設定するプロパティはありません。もちろん、これを行うためのコードを書くこともできますが、...すでに書いた誰かのコードを使用したいのです。
  • ポップアップサイズなどを設定するプロパティはありません。
  • 補完候補を表示するポップアップリストボックスがあります。そのリストをナビゲートするとき、テキストボックスは変更されません。リストボックスでフォーカスされているときに文字を入力しても、テキストボックスは更新されません。
  • リストボックスからフォーカスを移動しても、ポップアップリストボックスは消えません。これは紛らわしいです。

だから、私の質問:

*無料のWPFオートコンプリートテキストボックス動作するがあり、高品質のUIエクスペリエンスが提供されていますか?*


[〜#〜] answer [〜#〜]

以下がその方法です。

.0。 WPF Toolkit を取得します

.1。 WPF ToolkitのMSIを実行する

.2。 Visual Studio内で、ツールボックス(具体的にはデータ視覚化グループ)からUIデザイナーにドラッグアンドドロップします。 VSツールボックスでは次のようになります。

alt text

デザイナーを使用したくない場合は、xamlを手作りします。次のようになります。


<toolkit:AutoCompleteBox
   ToolTip="Enter the path of an Assembly."
   x:Name="tbAssembly" Height="27" Width="102"
   Populating="tbAssembly_Populating" />

...ここで、ツールキットの名前空間は次のようにマッピングされます。

xmlns:toolkit="clr-namespace:System.Windows.Controls;Assembly=System.Windows.Controls.Input.Toolkit"

.3。 Populatingイベントのコードを提供します。私が使用したものは次のとおりです。


private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e)
{
    string text = tbAssembly.Text;
    string dirname = Path.GetDirectoryName(text);

    if (Directory.Exists(Path.GetDirectoryName(dirname)))
    {
        string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly);
        string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly);
        var candidates = new List<string>();

        Array.ForEach(new String[][] { files, dirs }, (x) =>
            Array.ForEach(x, (y) =>
                      {
                          if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase))
                              candidates.Add(y);
                      }));

        tbAssembly.ItemsSource = candidates;
        tbAssembly.PopulateComplete();
    }
}

期待どおりに機能します。プロフェッショナルな気分です。 codeprojectコントロールが示す異常はありません。これは次のようになります。

alt text


WPFツールキットへのポインターのMatt に感謝します。

45
Cheeso

WPF Toolkit の最新のドロップには、AutoCompleteBoxが含まれています。 Microsoftの無料のコントロールセットで、その一部は.NET 4に含まれます。

ジェフウィルコックス-AutoCompleteBoxの紹介

32
Matt Hamilton

以下がその方法です。

.1。 WPF ToolkitのMSIを実行する

.2。 Visual Studio内で、ツールボックス(具体的にはデータ視覚化グループ)からUIデザイナーにドラッグアンドドロップします。 VSツールボックスでは次のようになります。

alt text

または、xamlを手作りします。次のようになります。


<toolkit:AutoCompleteBox
   ToolTip="Enter the path of an Assembly."
   x:Name="tbAssembly" Height="27" Width="102"
   Populating="tbAssembly_Populating" />

...ここで、ツールキットの名前空間は次のようにマッピングされます。

xmlns:toolkit="clr-namespace:System.Windows.Controls;Assembly=System.Windows.Controls.Input.Toolkit"

.3。 Populatingイベントのコードを提供します。私が使用したものは次のとおりです。


private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e)
{
    string text = tbAssembly.Text;
    string dirname = Path.GetDirectoryName(text);

    if (Directory.Exists(Path.GetDirectoryName(dirname)))
    {
        string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly);
        string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly);
        var candidates = new List<string>();

        Array.ForEach(new String[][] { files, dirs }, (x) =>
            Array.ForEach(x, (y) =>
                      {
                          if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase))
                              candidates.Add(y);
                      }));

        tbAssembly.ItemsSource = candidates;
        tbAssembly.PopulateComplete();
    }
}

WPFツールキットへのポインターを提供してくれたMattに感謝します。

17
Cheeso

Mindscapeは、WPF Autocomplete Textboxを含む つの無料コントロール も提供します

http://intellibox.codeplex.com/ は2013年10月1日以降に更新されたようで、単一のコントロールが含まれています。トロイの答えにコメントとして追加したが、十分な担当者がいない。そのコメントのため、私はそれをほとんど無視しました。

ドキュメントの使用例:

    <auto:Intellibox ResultsHeight="80"
                     ExplicitlyIncludeColumns="True"
                     Name="lightspeedBox"
                     DisplayedValueBinding="{Binding Product_Name}"
                     SelectedValueBinding="{Binding Product_Id}"
                     DataProvider="{Binding RelativeSource={RelativeSource FindAncestor, 
                     AncestorType={x:Type Window}}, Path=LinqToEntitiesProvider}"
                     Height="26"
                     Margin="12,26,12,0"
                     VerticalAlignment="Top">
        <auto:Intellibox.Columns>
            <auto:IntelliboxColumn DisplayMemberBinding="{Binding Product_Name}"
                                   Width="150"
                                   Header="Product Name" />
            <auto:IntelliboxColumn DisplayMemberBinding="{Binding Unit_Price}"
                                   Width="75"
                                   Header="Unit Price" />
            <auto:IntelliboxColumn DisplayMemberBinding="{Binding Suppliers.Company_Name}"
                                   Width="125"
                                   Header="Supplier" />
        </auto:Intellibox.Columns>
    </auto:Intellibox>
2
RationalDev

社内プロジェクトでIntelliboxを使用しています。 http://intellibox.codeplex.com/

非常に直感的な検索のためのプロバイダーパターンの使用だと思います。

Rakeの答えは、その使用方法の例を示しており、彼が指摘しているように、昨年後半にいくつかの開発が見られました(ただし、これは最後に使用した後は十分です)。

2
Troy

CodePlexでWPF Auto Complete TextBoxを試すことができます: https://wpfautocomplete.codeplex.com/

2
Deepak Bhardwaj