Этот другой вопрос SO спрашивает об автозаполнении текстового поля в WPF. Несколько человек создали их, и один из ответов, приведенных там, предлагает эту статью о проекте кода.
Но я не нашел ни одного текстового поля автозаполнения WPF, которое можно сравнить с текстовым полем автозаполнения WinForms. Пример кода проекта работает, вроде,...
...но
- он не структурирован как повторно используемый элемент управления или DLL. Это код, который мне нужно встроить в каждое приложение.
- Работает только с каталогами. у него нет свойств для установки, является ли источник автозаполнения только каталогами файловой системы, или файлами файловой системы, или.... и т.д. Конечно, я мог бы написать код для этого, но... я бы предпочел использовать уже написанный другой код.
- у него нет свойств для установки размера всплывающего окна и т.д.
- есть всплывающее окно со списком возможных завершений. При навигации по этому списку текстовое поле не меняется. Ввод символа, находящегося в фокусе в списке, не приводит к обновлению текстового поля.
- перемещение фокуса от списка не приводит к исчезновению всплывающего списка. Это смущает.
Итак, мой вопрос:
* Есть ли у кого-нибудь БЕСПЛАТНОЕ текстовое поле автозаполнения WPF, которое работает и обеспечивает качественный пользовательский интерфейс? *
ОТВЕТ
Вот как я это сделал:
+0,0. получить инструментарий WPF
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.