WPF中的FF3 AwesomeBar行为

时间:2009-02-03 17:00:47

标签: c# .net wpf combobox

我正在尝试在WPF中实现类似于Firefox 3 AwesomeBar的行为。我有一个ComboBox使用DataTemplate,使得下拉列表看起来像是AwesomeBar的下拉列表,但我不确定如何获得正确的行为。

我想要发生的是用户将其搜索键入ComboBox的TextBox位,然后逐步缩小下拉列表中的结果范围。我想我可能会让数据库查询部分工作(因为结果将来自数据库)但我想要得到的是用户开始输入时打开的下拉位(就像在Firefox中一样) 3)然后列表中的第一个项目将被自动选中,列表中的其他项目可以通过使用箭头键或点击它们来选择。

更新

我现在已经找到了让ComboBox下拉的程序化方法(使用IsDropDownOpen = true),但我还有一些其他问题:

首先,当我输入内容时,它会下降,但它不会选择最接近我正在输入的匹配项,其次当我键入一个唯一选择项目的内容时,它会自动关闭并运行SelectedItemChanged方法。我希望它只在我实际点击它或按下回车时关闭并运行代码(而不是仅使用向上或向下箭头选择它)。任何想法如何让它做我想要的?如果不够清楚,我可以提供更多信息。

2 个答案:

答案 0 :(得分:3)

您想要的大多数功能已经在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;
}

答案 1 :(得分:0)

使用CollectionView访问您的收藏。

ListCollectionView _myCollectionView = new ListCollectionView(someCollection);

将ComboBox绑定到此CollectionView。这将提供一个过滤机制。实现一个过滤方法(此代码中的SearchText将是您的ComboBox文本...我会将其存储在名为SearchText的DP中,并从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);