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.

Джефф Уилкокс-представляем AutoCompleteBox


вот как я это сделал:

.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/