private static async void GetSuggestions(SearchSuggestionsRequestDeferral deferral, SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args) { try { var provider = GetProvider(sender); var query = args.QueryText; var suggestions = await Task.Run(() => provider.GetSuggestions(CancellationToken.None, query)); var visitor = new AppendToSearchSuggestionCollectionVisitor(args.Request.SearchSuggestionCollection); foreach (var searchSuggestion in suggestions) { searchSuggestion.Accept(visitor); } deferral.Complete(); } catch (Exception ex) { Debug.WriteLine(ex); } }
private async void TextName_SuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args) { if (!string.IsNullOrEmpty(args.QueryText)) { var characters = ViewModel.Characters.ToList(); //var suggestions = Data.UnicodeData.Characters // .Where(c => characters.Contains((char)c.CodePageInt)) // .SelectMany(c => c.AllNames) // .Where(n => n.StartsWith(args.QueryText, StringComparison.CurrentCultureIgnoreCase)) // .ToList(); // used cache list of filtered unicode character objects. This is too expensive to do everytime the user types in a character. List <Models.Character> unicodeCharacters; SearchSuggestionsRequestDeferral deferral = null; if (!unicodeCharactersTask.IsCompleted) { deferral = args.Request.GetDeferral(); unicodeCharacters = await unicodeCharactersTask; } else { unicodeCharacters = unicodeCharactersTask.Result; } var suggestions = unicodeCharacters .SelectMany(c => c.AllNames) .Where(n => n.StartsWith(args.QueryText, StringComparison.CurrentCultureIgnoreCase)) .ToList(); args.Request.SearchSuggestionCollection.AppendQuerySuggestions(suggestions); if (deferral != null) { deferral.Complete(); } } }