WPF: автозаполнение текстового поля, ...снова
Это другой так вопрос запрашивает текстовое поле автозаполнения в WPF. Несколько человек построили их, и один из ответов, данных там, предполагает эта статья codeproject.
но я не нашел текстового поля автозаполнения WPF, которое сравнивается с текстовым полем автозаполнения WinForms. Образец codeproject работает, своего рода, ...
alt-текст http://i50.tinypic.com/sx2ej5.jpg
...но!--9-->
- он не структурирован как повторно используемый элемент управления или DLL. Это код, который мне нужно внедрить в каждое приложение.
- это работает только с каталогами. он не имеет свойств для установки, является ли источник автозаполнения только каталогами файловой системы или файлами файловой системы или ....так далее. Конечно, я мог бы написать код для этого, но.....Я бы предпочел использовать уже написанный чей-то код.
- это не имеет свойств для установки размера всплывающего окна и т. д.
- есть всплывающее окно списка, которое представляет возможные завершения. При навигации по этому списку текстовое поле не изменяется. Ввод символа при фокусировке в списке не приводит к обновлению текстового поля.
- перемещение фокуса от списка не делает всплывающее окно списка исчезать. Это сбивает с толку.
Итак, мой вопрос:
*у кого-нибудь есть бесплатный WPF Автозаполнения текстовое поле работает, и обеспечивает качественный пользовательский интерфейс?*
ответ
вот как я это сделал:
.0. получить инструментарий WPF
.1. запустите MSI для инструментария WPF
.2. В Visual Studio перетащите элемент "панель инструментов" - в частности, группу визуализации данных-в конструктор пользовательского интерфейса. Это выглядит так в vs toolbox:
alt текст 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" />
...где пространство имен toolkit отображается следующим образом:
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 текст http://i50.tinypic.com/24qsopy.jpg
спасибо Мэтту за указателем в инструментарий WPF.
5 ответов
новейшая капля инструментарий WPF включает в себя AutoCompleteBox. Это бесплатный набор элементов управления от Microsoft, некоторые из которых будут включены в .NET 4.
вот как я это сделал:
.1. запустите MSI для инструментария WPF
.2. В Visual Studio перетащите элемент "панель инструментов" - в частности, группу визуализации данных-в конструктор пользовательского интерфейса. Это выглядит так в vs toolbox:
alt текст 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" />
...где пространство имен toolkit отображается таким образом:
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();
}
}
спасибо Matt за указатель на инструментарий WPF.
Mindscape также предоставляет 3 Управление включая текстовое поле автозаполнения WPF
http://intellibox.codeplex.com/ кажется, обновлено не так давно, как 1 октября 2013 года, и содержит один элемент управления. Я бы добавил как комментарий к ответу Троя, но у меня недостаточно репутации. Я почти проигнорировала его из-за этого комментария.
пример использования из документации:
<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>
Я использую Intellibox в своем внутреннем проекте. http://intellibox.codeplex.com/
Я считаю, что это использование шаблона поставщика для Поиск очень понятный.
ответ рейка дает пример того, как его использовать, и, как он указывает, он видел некоторое развитие в конце прошлого года (хотя это хорошо после того, как я в последний раз использовал его).
вы можете попробовать WPF Auto Complete TextBox в CodePlex здесь:https://wpfautocomplete.codeplex.com/