FF3 AwesomeBar-подобное поведение в WPF - PullRequest
1 голос
/ 03 февраля 2009

Я пытаюсь реализовать поведение, подобное Firefox 3 AwesomeBar в WPF. У меня есть ComboBox для использования DataTemplate, который делает раскрывающийся список похожим на раскрывающийся список для AwesomeBar, но я не уверен, как получить правильное поведение.

Я хочу, чтобы пользователь ввел свой поиск в бит TextBox ComboBox, а затем постепенно сужал результаты в раскрывающемся списке. Я думаю, что я, вероятно, смогу заставить базу данных запрашивать часть этой работы (поскольку результаты будут поступать из базы данных), но я хочу получить раскрывающийся бит, как только пользователь начнет печатать (как это происходит в Firefox). 3) и затем первый элемент в списке, который будет выбран автоматически, и другие элементы в списке, которые можно будет выбрать с помощью клавиш со стрелками или путем нажатия на них.

Обновление:

Я теперь нашел программный способ заставить ComboBox выпадать (используя IsDropDownOpen = true), но у меня все еще есть несколько других проблем:

Во-первых, когда я набираю что-то, оно падает, но не выбирает совпадение, наиболее близкое к тому, что я печатаю, и, во-вторых, когда я набираю что-то, что уникально выбирает элемент, оно автоматически закрывается и запускает метод SelectedItemChanged. Я хочу, чтобы он закрывался и запускал код только тогда, когда я на самом деле щелкнул по нему или нажал клавишу ввода (а не просто выделил его с помощью стрелок вверх или вниз). Есть идеи как заставить его делать то, что я хочу? Я могу дать больше информации, если это недостаточно ясно.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2009

Большая часть нужной вам функциональности уже есть в ComboBox.

Есть ли программный способ заставить выпадающий список ComboBox выпадать?

Да, вы можете сделать это, установив для свойства ComboBox.IsDropDownOpen значение true .

И есть ли способ выбрать элемент, не закрывая список и не становясь выбранным элементом?

Когда вы установите IsEditable на true , он выберет первый элемент, который соответствует введенному вами тексту - когда вы выпадаете, элемент все равно будет выбран. Этот пример не выполняет фильтрацию из большего набора данных, но он должен помочь вам начать:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid.Resources>
        <x:Array x:Key="data" Type="{x:Type sys:String}">
            <sys:String>Veni</sys:String>
            <sys:String>Vidi</sys:String>
            <sys:String>Vici</sys:String>
        </x:Array>
    </Grid.Resources>
    <ComboBox x:Name="myCombo" ItemsSource="{StaticResource data}" IsEditable="True" PreviewTextInput="myCombo_PreviewTextInput"/>
</Grid>

В коде позади мы открываем ComboBox. Ваш обработчик также может выполнить фильтрацию здесь:

private void myCombo_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    myCombo.IsDropDownOpen = true;
}
0 голосов
/ 09 февраля 2009

Используйте CollectionView для доступа к вашей коллекции.

ListCollectionView _myCollectionView = new ListCollectionView(someCollection);

Свяжите свой ComboBox с этим CollectionView. Это обеспечит механизм фильтрации. Реализуйте метод фильтрации (SearchText в этом коде будет вашим текстом ComboBox ... Я бы сохранил его в DP под названием SearchText и обновил бы его из ComboBox):

private bool FilterMethod(string expression)
{

     if (expression != null && this.SearchText != null)
     {
          if (expression.ToUpper().Contains(this.SearchText.ToUpper()))
              return true;

          else
              return false;
     }

     return true;
}

Теперь, когда пользователь что-то печатает, используйте этот метод фильтрации в CollectionView:

_myCollectionView.Filter = new Predicate<string>(FilterMethod);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...