Этот другой вопрос SO спрашивает об автозаполнении текстового поля в WPF. Несколько человек создали их, и один из ответов, приведенных там, предлагает эту статью проекта кода .
Но я не нашел ни одного текстового поля автозаполнения WPF, которое можно сравнить с текстовым полем автозаполнения WinForms. Пример кода проекта работает, вроде, ...
... но
- он не структурирован как повторно используемый элемент управления или DLL. Это код, который мне нужно встроить в каждое приложение.
- Работает только с каталогами. у него нет свойств для установки, является ли источник автозаполнения только каталогами файловой системы, или файлами файловой системы, или .... и т. д. Конечно, я мог бы написать код для этого, но ... я бы предпочел использовать уже написанный чужой код.
- У него нет свойств для установки размера всплывающего окна и т. Д.
- есть всплывающее окно со списком возможных завершений. При навигации по этому списку текстовое поле не меняется. Ввод символа, находящегося в фокусе в списке, не приводит к обновлению текстового поля.
- перемещение фокуса от списка не приводит к исчезновению всплывающего списка. Это смущает.
Итак, мой вопрос:
* У кого-нибудь есть БЕСПЛАТНОЕ текстовое поле автозаполнения WPF , которое работает и обеспечивает качественный пользовательский интерфейс? *
ОТВЕТ
Вот как я это сделал:
0,0. получить WPF Toolkit
0,1. запустить MSI для WPF Toolkit
0,2. В Visual Studio перетаскивайте мышью из панели инструментов, в частности, из группы «Визуализация данных», в конструктор пользовательского интерфейса. На панели инструментов VS это выглядит так:
Если вы не хотите использовать дизайнер, сделайте вручную 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();
}
}
Это работает, так, как вы ожидаете. Он чувствует себя профессионально. Нет никаких аномалий, которые проявляет элемент управления codeproject. Вот как это выглядит:
Спасибо Мэтту за указатель на набор инструментов WPF.