André Alves de Lima

Talking about Software Development and more…

Mais dicas relacionadas ao controle SearchBox no WinRT

Olá caro(a) leitor(a).

O post de hoje é um complemento do artigo da semana passada, cujo tema foi o controle SearchBox em aplicações para a Windows Store. Gostaria de abordar mais dois pontos relacionados a esse controle.

1. Exibindo sugestões customizadas

Como você já deve ter percebido, a SearchBox no WinRT possui um mecanismo de sugestões de busca. Por padrão, toda busca efetuada no contexto da aplicação é automaticamente armazenada na local storage e utilizada como sugestão em pesquisas futuras:

Essa funcionalidade automática quebra o galho. Mas, e se quisermos exibir itens específicos como sugestões por padrão na SearchBox? Por exemplo, se pensarmos nesse aplicativo que efetua buscas em uma lista de produtos, não seria bem interessante se exibíssemos por padrão os produtos mais pesquisados como sugestões de busca?

Pois bem, para implementarmos essa funcionalidade, basta utilizarmos o evento SuggestionRequested do controle SearchBox. No handler desse evento, é só adicionar as sugestões de busca na propriedade Request.SearchSuggestionCollection (presente no SearchBoxSuggestionsRequestedEventArgs) e, voilà, as sugestões são exibidas.

Vamos verificar como podemos adicionar alguns produtos como sugestões de busca no projeto do artigo anterior. Primeiramente, crie um array de strings chamado NomesDeProdutosMaisPesquisados dentro da classe MainViewModel. Esse array deve conter a lista de produtos que queremos exibir como sugestões de busca. Neste exemplo vamos preencher esse array de forma fixa, mas, em uma aplicação real poderíamos recuperar a lista de produtos mais pesquisados do banco de dados, por exemplo.

public string[] NomesDeProdutosMaisPesquisados = { "pão", "leite" };

Agora, na declaração da SearchBox na MainPage, adicione a última linha correspondente ao handler do evento SuggestionsRequested:

        <SearchBox HorizontalAlignment="Right"
                   VerticalAlignment="Top"
                   Width="250"
                   Margin="40,60"
                   PlaceholderText="Digite para pesquisar..."
                   QuerySubmitted="SearchBox_QuerySubmitted"
                   SuggestionsRequested="Searchbox_SuggestionsRequested"/>

Finalmente, vá ao code behind da MainPage e inclua o seguinte trecho de código para o handler desse evento:

        private void Searchbox_SuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
        {
            string queryTextLowercase = args.QueryText.ToLowerInvariant();

            foreach (string nomeDeProdutoMaisPesquisado in viewModel.NomesDeProdutosMaisPesquisados)
            {
                if ((string.IsNullOrWhiteSpace(queryTextLowercase)) ||
                    (nomeDeProdutoMaisPesquisado.ToLowerInvariant().StartsWith(queryTextLowercase)))
                {
                    args.Request.SearchSuggestionCollection.AppendQuerySuggestion(nomeDeProdutoMaisPesquisado);
                }
            }
        }

Como você pode observar, o código é muito fácil. Nós simplesmente iteramos pela lista de produtos mais pesquisados (vindo da ViewModel) e, caso o início do nome do produto seja igual à query string, nós adicionamos o produto à lista de sugestões utilizando o método AppendQuerySuggestion. E com isso o produto automaticamente aparece como sugestão de busca.

Simples não? Agora vamos à segunda dica relacionada ao controle SearchBox.

2. Limpando o histórico de buscas

Outra funcionalidade habilitada por padrão no controle SearchBox é o histórico de buscas. Com essa feature habilitada, as buscas previamente efetuadas são automaticamente armazenadas e apresentadas como sugestões em buscas futuras. Caso você queira desabilitar essa funcionalidade em alguma SearchBox, basta configurar a propriedade SearchHistoryEnabled como false.

Mas, o que eu realmente quero mostrar é como limpar o histórico de buscas da SearchBox. Para conseguir essa façanha, basta criar uma instância da classe SearchSuggestionManager e executar o método ClearHistory. Com isso, todo o histórico de buscas da aplicação é eliminado.

Para vermos isso em funcionamento, adicione um botão à MainPage e nesse botão adicione um handler para o evento Click (poderíamos ter utilizado um Command ao invés do evento Click, mas, para simplificar, escolhi utilizar o evento Click mesmo):

        <Button Content="Limpar sugestões"
                Margin="60"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="LimparSugestoes_Click"/>

Vá ao code behind da MainPage e adicione o handler que fará a chamada ao método ClearHistory:

        private void LimparSugestoes_Click(object sender, RoutedEventArgs e)
        {
            var searchManager = new Windows.ApplicationModel.Search.Core.SearchSuggestionManager();
            searchManager.ClearHistory();
        }

Execute o aplicativo e veja que o histórico de buscas é realmente eliminado quando clicamos no botão “Limpar sugestões”. Além dessa funcionalidade, o SearchSuggestionManager também pode ser utilizado para adicionar históricos de buscas customizados, através do método AddToHistory.

E com isso eu finalizo mais este artigo. Espero que vocês tenham gostado e que ele seja útil para vocês. Confiram o exemplo deste post no meu repositório do GitHub.

Até a próxima!

André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *