This other SO question询问WPF中的自动填充文本框。有几个人建了这些,其中一个答案是this codeproject article。
但是我没有找到任何与WinForms自动填充文本框进行比较的WPF自动完成文本框。 codeproject示例有效,有点......,
alt text http://i50.tinypic.com/sx2ej5.jpg
...但
所以,我的问题:
*是否有人有免费的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工具包。
答案 0 :(得分:32)
WPF Toolkit的最新一滴包含一个AutoCompleteBox。它是Microsoft提供的一套免费控件,其中一些将包含在.NET 4中。
答案 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/