2017-07-28 35 views
1

在我的自動建議框中,當我按下建議列表中的箭頭時,建議列表立即自動關閉。如何使用Auto Suggest Box中的向下箭頭鍵?

我想保持打開列表,直到用戶按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; 
     } 

    } 

我從code.Do設置的ItemsSource我需要處理Keup酒店事件與否?

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

在此先感謝。

+0

當您按下向下鍵,AutoSuggestBox或建議列表時,哪個控件具有焦點? – jsmyth886

+0

建議列表。 – tushargoyal1309

+1

無法重現您的問題,使用'AutoSuggestBox'創建了一個簡單的應用程序。當焦點切換到建議列表時,向上和向下鍵都可以工作,而沒有任何額外的鍵盤處理代碼。你可以發佈顯示你如何打開建議列表的代碼嗎? – jsmyth886

回答

-1

這可能對你有幫助。我在Windows上使用它ComboBox

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Down) MessageBox.Show("hello"); 
} 
+0

這不是winforms。 – Jessica