代码之家  ›  专栏  ›  技术社区  ›  robintw

FF3 WPF中的棒状行为

  •  1
  • robintw  · 技术社区  · 15 年前

    我试图在WPF中实现类似Firefox3 AwesomeBar的行为。我有一个组合框来使用一个数据模板,使下拉菜单看起来像AwesomeBar的下拉菜单,但我不确定如何获得正确的行为。

    我想让用户在组合框的文本框中输入搜索结果,然后在下拉列表中逐渐缩小搜索结果的范围。我想我可能可以让数据库查询部分正常工作(因为结果将来自数据库),但我想得到的是在用户开始键入时立即打开的下拉位(就像Firefox3中那样)然后是列表中要自动选择的第一个项目,以及使用箭头键或单击箭头键可以选择的列表中的其他项目。

    更新:

    首先,当我键入某个内容时,它会下拉,但不会选择与我键入内容最接近的匹配项;其次,当我键入某个内容时,它会唯一地选择一个项目,它会自动关闭并运行SelectedItemChanged方法。我希望它只在我实际单击它或按enter键时关闭并运行代码(而不仅仅是使用向上或向下箭头对其进行选择)。有什么办法让它做我想做的吗?如果还不够清楚,我可以提供更多的信息。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Robert Macnee    15 年前

    您想要的大部分功能已经在组合框中。

    有没有一种编程方法可以让组合框列表下拉?

    是的,您可以通过设置 ComboBox.IsDropDownOpen 财产 符合事实的 .

    有没有一种方法可以让一个项目在不关闭列表并成为选中项目的情况下被选中?

    当你设定 IsEditable 符合事实的

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

    在代码隐藏中,我们打开组合框。您的处理程序也可以在此处进行过滤:

    private void myCombo_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        myCombo.IsDropDownOpen = true;
    }
    
        2
  •  0
  •   Brent Schooley    15 年前

    使用CollectionView访问您的收藏。

    ListCollectionView _myCollectionView = new ListCollectionView(someCollection);
    

    将组合框绑定到此CollectionView。这将提供一种过滤机制。实现一个过滤方法(此代码中的SearchText将是您的组合框文本…我将它存储在名为SearchText的DP中,并从组合框中更新):

    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);