WPF:AutoComplete TextBox,...再次

时间:2010-02-26 00:31:13

标签: wpf textbox autocomplete

This other SO question询问WPF中的自动填充文本框。有几个人建了这些,其中一个答案是this codeproject article

但是我没有找到任何与WinForms自动填充文本框进行比较的WPF自动完成文本框。 codeproject示例有效,有点......,

alt text http://i50.tinypic.com/sx2ej5.jpg

...但

  • 它不是可重复使用的控件或DLL。这是我需要嵌入每个应用程序的代码。
  • 仅适用于目录。它没有用于设置自动完成源是仅文件系统目录,还是文件系统文件或....等的属性。当然,我可以编写代码来执行此操作,但是...我宁愿使用已编写的其他人的代码。
  • 它没有设置弹出窗口大小的属性等。
  • 有一个弹出列表框,显示可能的完成情况。浏览该列表时,文本框不会更改。在焦点列表框中键入字符不会导致文本框更新。
  • 远离列表框导航焦点不会使弹出列表框消失。这令人困惑。

所以,我的问题:

*是否有人有免费的WPF自动完成文本框 可以使用 ,并提供高质量的用户体验?*


ANSWER

我是这样做的:

0.0。得到WPF Toolkit

0.1。运行WPF Toolkit的MSI

0.2。在Visual Studio中,从工具箱(特别是数据可视化组)拖放到UI设计器中。在VS工具箱中看起来像这样:

alt text http://i49.tinypic.com/s12q6x.jpg

如果您不想使用设计师,请手工制作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"

0.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();
    }
}

它的工作原理,就像你期望的那样。感觉很专业。代码项目控件没有出现任何异常。这就是它的样子:

alt text http://i50.tinypic.com/24qsopy.jpg


Thanks to Matt for the pointer到WPF工具包。

5 个答案:

答案 0 :(得分:32)

WPF Toolkit的最新一滴包含一个AutoCompleteBox。它是Microsoft提供的一套免费控件,其中一些将包含在.NET 4中。

Jeff Wilcox - Introducing the AutoCompleteBox

答案 1 :(得分:17)

我是这样做的:

0.1。运行WPF Toolkit的MSI

0.2。在Visual Studio中,从工具箱(特别是数据可视化组)拖放到UI设计器中。在VS工具箱中看起来像这样:

alt text http://i49.tinypic.com/s12q6x.jpg

或者,手工制作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"

0.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();
    }
}

感谢Matt指向WPF工具包的指针。

答案 2 :(得分:2)

我在内部项目中使用Intellibox。 http://intellibox.codeplex.com/

我发现使用提供者模式非常直观地进行搜索。

Rake的回答提供了一个如何使用它的例子,正如他指出的那样,它在去年年底已经看到了一些发展(尽管在我上次使用它之后这很好)。

答案 3 :(得分:2)

Mindscape还提供3 free controls,其中包括WPF自动填充文本框

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>

答案 4 :(得分:2)

您可以在CodePlex上尝试WPF自动完成文本框:https://wpfautocomplete.codeplex.com/