如何在Auto Suggest Box中使用向下箭头键?

时间:2017-07-28 06:36:28

标签: c# xaml uwp autosuggest

在我的“自动建议”框中,当我按下建议列表中的箭头时,建议列表会立即自动关闭。

我想继续打开列表,直到用户按下Enter键。 这是我的XAML代码

<AutoSuggestBox x:Name="recipient" KeyUp="recipient_KeyDown" FontSize="18" Height="50" TextChanged="recipient_TextChanged" SuggestionChosen="recipient_SuggestionChosen" x:Uid="recipienttextplaceholder" HorizontalAlignment="Left" Background="White" VerticalAlignment="Center" Margin="30,20,0,0" Style="{StaticResource AutoSuggestBoxStyle2}">
                    <AutoSuggestBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Text="{Binding FirstName}" Grid.Column="0" x:Name="firstName" Visibility="{Binding FirstName, Converter={StaticResource NullOrWhiteSpaceConverter}}" TextAlignment="Left"/>

                                <TextBlock Text="|" Grid.Column="0" Margin="0,0,-10,0" Visibility="{Binding Visibility,ElementName=middleName}" HorizontalAlignment="Right"/>

                                <TextBlock Text="{Binding MiddleName}" Margin="10,0,0,0" Visibility="{Binding MiddleName, Converter={StaticResource NullOrWhiteSpaceConverter}}" x:Name="middleName" Grid.Column="1" TextAlignment="Left"/>

                                <TextBlock Text="|" Grid.Column="1" Visibility="{Binding Visibility,ElementName=lastName}" Margin="0,0,-6,0" HorizontalAlignment="Right"/>

                                <TextBlock Text="{Binding LastName}" Margin="10,0,0,0" x:Name="lastName" Visibility="{Binding LastName, Converter={StaticResource NullOrWhiteSpaceConverter}}" Grid.Column="2" TextAlignment="Left"/>

                                <!--<TextBlock Text="|" Grid.Column="2" Margin="0,0,-6,0" Visibility="{Binding Visibility,ElementName=lastName}" HorizontalAlignment="Right"/>-->
                            </Grid>
                        </DataTemplate>
                    </AutoSuggestBox.ItemTemplate>
                </AutoSuggestBox>

TextChanged事件:

private void recipient_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
    {
        if (sender.Text.Length == 0)
        {
            recipient.ItemsSource = new List<string>();
            return;
        }
        var recipientFilteredByPersonData = new List<Table_People>();
        var recipientFilteredByPlace = new List<Table_Places>();

        if (PeopleList != null)
        {
            foreach (var item in PeopleList)
            {
                if (item.FirstName.Contains(sender.Text, StringComparison.OrdinalIgnoreCase) || item.MiddleName.Contains(sender.Text, StringComparison.OrdinalIgnoreCase) || item.LastName.Contains(sender.Text, StringComparison.OrdinalIgnoreCase))
                {
                    item.Icon = "../Assets/user_profile.png";
                    recipientFilteredByPersonData.Add(item);
                }
            }
            cvrbyperson.Source = recipientFilteredByPersonData.OrderBy(x => x.FirstName).GroupBy(x => x.FirstName[0]).ToList();
            //recipient.ItemsSource = recipientFilteredByPersonData;
        }

        if (PlacesList != null)
        {
            foreach (var item in PlacesList)
            {
                if (item.AccountNumber.Contains(sender.Text, StringComparison.OrdinalIgnoreCase) || item.Name.Contains(sender.Text, StringComparison.OrdinalIgnoreCase))
                {
                    item.Icon = "../Assets/ic_location.png";
                    recipientFilteredByPlace.Add(item);
                }
            }
            cvrbyplace.Source = recipientFilteredByPlace.OrderBy(x => x.FirstName).GroupBy(x => x.FirstName[0]).ToList();
            //recipient.ItemsSource = recipientFilteredByPlace;
        }
        List<object> combinePlacePerson = (from x in recipientFilteredByPersonData select (object)x).ToList();
        combinePlacePerson.AddRange((from x in recipientFilteredByPlace select (object)x).ToList());
        if (combinePlacePerson.Count == 0)
        {
            var noResults = new List<Table_People>();
            var resultWithNoItem = new Table_People { FirstName = "No results." };
            noResults.Add(resultWithNoItem);
            recipient.ItemsSource = noResults;
        }
        else
        {
            recipient.ItemsSource = combinePlacePerson;
        }
    }

建议选择事件:

 private void recipient_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
    {
        var getType = args.SelectedItem.GetType();
        if (getType.Name == "Table_People")
        {
            var selectedItemRecipient = args.SelectedItem as Table_People;
            sender.Text = selectedItemRecipient.FirstName + " " + selectedItemRecipient.LastName;
            recipienterror.Visibility = Visibility.Collapsed;
            _personID = selectedItemRecipient.PersonID;
        }
        else
        {
            var selectedItemRecipientPlaces = args.SelectedItem as Table_Places;
            _placeID = selectedItemRecipientPlaces.PlaceID;
            sender.Text = selectedItemRecipientPlaces.FirstName + " " + selectedItemRecipientPlaces.LastName;
            recipienterror.Visibility = Visibility.Collapsed;
        }

    }

我从代码中设置ItemsSource。我是否需要处理KeUp事件?

private void recipient_KeyUp(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Down)
        {
            recipient.IsSuggestionListOpen = true;
        }
    }

提前感谢。

1 个答案:

答案 0 :(得分:-1)

这可能会对你有所帮助。我在Windows窗体ComboBox

上使用它
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down) MessageBox.Show("hello");
}