Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

WinRT : expressions régulières et panneau de recherche (Windows Store apps)

[new:30/09/2013]Créer de bonnes UI est essentiel, le cross-plateforme, sujet qui nous intéresse beaucoup sur Dot.Blog, uniformise le code mais cela ne veut pas dire qu’il est interdit de tirer profit des spécificités de chaque plateforme ! Le panneau de recherche de WinRT pour les applications Windows Store est une de ces spécificités a supporter absolument !

Le panneau de recherche

Le panneau de recherche de Windows 8 est particulière intéressant car il est capable via un processus unifié de “traverser” les couches applicatives. Chaque application peut retourner des informations en s’abonnant au processus de recherche global du système.

image

Être fournisseur de données pour des recherches de ce type est assez simple, mais il y a encore plus simple, c’est fournir des propositions (ou suggestions) dans l’écran de recherche.

Suggérer

La capture ci-dessous montre sous la zone de saisie de la recherche les trois mots suggérés par l’application, l’utilisateur ayant tapé “cu” :

image

Comme je le disais, proposer une recherche complète est un must et n’est guère compliqué, mais suggérer des mots est encore une autre chose. En général on couple les fonctions : on commence par suggérer des réponses possibles à l’utilisateur puis on gère un écran de résultat si ce dernier clique sur l’un des mots suggérés.

Ici nous nous intéresserons uniquement à la partie suggestion car elle est souvent négligée alors que le Charme de recherche a déjà été traité par Dot.Blog (voir l’article avec le code à télécharger : Donner du Charme à vos applications Windows 8)

Cela ne réclame pas grand chose et l’utilisateur pourra bénéficier d’un accès simple aux principales données de l’application.

Cette méthode de recherche est celle qui est montrée dans la capture ci-dessus et qui s’invoque par le raccourci <touche Windows> Q.

S’abonner, répondre, proposer…

Je ne referais pas l’article ci-dessus qui montre comment ajouter le support de la recherche et notamment comment activer cette fonction dans le manifeste de l’application (si vous ne le faites pas vous aurez une exception à l’exécution totalement fumeuse et incompréhensible qui ne met absolument pas sur la piste, vous êtes prévenus !).

Une fois l’activation dans le manifeste effectuée tout va se jouer dans App.xaml.cs.

D’abord il faut obtenir une référence sur le panneau de recherche puis s’abonner à son évènement SuggestionsRequested (suggestions demandées).

C’est dans la méthode OnWindowCreated (dont il faut créer une surcharge) que se joue cette partie là, en deux lignes (qu’on pourrait résoudre à une seule en se passant de la variable temporaire) :

protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    var searchPane = SearchPane.GetForCurrentView();
    searchPane.SuggestionsRequested += searchPane_SuggestionsRequested;
}

On propose alors un gestionnaire pour l’évènement et c’est naturellement dans ce dernier que va se trouver le code qui recherche dans les données de l’application et qui retournera les suggestions à Windows :

        void searchPane_SuggestionsRequested(
              SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)
        {
            var results =
              new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);

            // Builds the regular expression.
            var query =
              string.Format(@"(?<!\w){0}(\w+|\s+)", args.QueryText.Trim());

            // Search among all the groups.
            var groups = SampleDataSource.GetGroups("AllGroups");
            foreach (var item in groups.SelectMany(g => g.Items))
            {
                var matches =
                 Regex.Matches(item.Content, query, RegexOptions.IgnoreCase);

                foreach (Match match in matches)
                    results.Add(match.Value.Trim());
            }

            // Orders the results and add them to the search suggestions.
            var suggestions = results.OrderBy(s => s).Take(5);
            args.
               Request.
                  SearchSuggestionCollection.
                     AppendQuerySuggestions(suggestions);
        }

Nul besoin du code de l’exemple car ici nous sommes tout simplement parti du template proposé par Visual Studio sans rien y changer. Il s’agit du template “Grid App”. Il propose déjà une source de données remplie avec du texte de type Lorem Ipsum (d’où l’étrangeté des mots suggérés dans la capture écran plus haut!).

Le mécanisme utilisé consiste à traverser les groupes d’items et de balayer chaque item. La recherche s’effectue via une expression régulière pour ne prendre que des mots commençant par la recherche de l’utilisateur. On peut personnaliser à la fois l’expression pour offrir d’autres types de résultats et la séquence elle-même puisque, bien entendu, elle est fortement liée aux données utilisées par l’application donc ici à celles du template Visual Studio…

Conclusion

Chercher c’est bien, suggérer les bons mots à chercher c’est encore mieux !

Si nous avions déjà vu comment offrir les bénéfices du Charme de recherche la suggestion n’avait pas été traitée. Et je me suis aperçu que ce sujet l’était très rarement.

Il est vrai que tout ce qui concerne WinRT est traité “très rarement” sur Internet, symptôme évident d’une adoption modérée alors qu’on trouve de tout à propos de nombreuses autres plateformes.

Mais WinRT, s’il ne peut représenter l’avenir à lui seul parce que trop normalisateur notamment, et je le pense depuis le départ, n’en est pas moins une plateforme exceptionnelle. Microsoft a raison de continuer sa promotion même si je pense qu’ils devraient clarifier le rôle essentiel de WPF qui reste indispensable dans une vaste majorité de cas.

Dans la démarche cross-plateforme que je vous propose depuis des mois (plus d’un an certainement, c’est à dire au moins depuis la sortie de Windows 8 si vous êtes perspicace !) toutes les plateformes comptent, soit parce que l’avenir de telle ou telle autre, comme WinRT ou iOS, est difficile à prévoir, soit parce qu’elles s’imposent à nous par leur succès (comme Android).

C’est justement en adoptant une démarche cross-plateforme qu’on se protège contre tous les doutes et toutes les modes. La démarche est simple : jouer les Madame Irma est un jeu dangereux et plutôt que de faire des choix de développement hasardeux comme on tire une carte de Tarot, nous embrassons toutes les plateformes, ajoutant ou supprimant au fil du temps celles qui s’imposent et celles qui ne manqueront pas de disparaitre dans le même temps, le tout sans toucher ni mettre en cause notre code métier, celui qui coute cher et qui est l’âme de l’application.

Cette démarche évite les choix dangereux et permet d’avancer, maintenant, sans attendre plus. Elle permet aussi d’éviter d’avoir à faire des choix douloureux, à “virer sa cuti” en passant à l’ennemi… C’est une démarche zen, une démarche dans laquelle nous pouvons adorer WinRT tout en louant l’extraordinaire percée de Android…

Dans ce cadre connaître chaque plateforme pour offrir à l’utilisateur la meilleure UX possible est indispensable. Une bonne UX fait le succès d’une application. Le cross-plateforme uniformise le code mais pas l’UX qui doit rester unique.

Et sous WinRT, la bonne utilisation des Charmes fait partie d’une bonne UX. Puisse ce billet l’avoir rappelé à votre vigilance de développeur soucieux de produire des applications awesome ! Sourire

blog comments powered by Disqus