Publié vendredi 4 mai 2012 13:13 par Groc

Rx pour un BusyMessage plus user-friendly sur Windows Phone 7

Sur Windows Phone, lorsque j’ai des appels à des services qui s’enchainent, j’aime assez voir le status des opérations s’afficher dans le progress indicator pour bien montrer à l’utilisateur qu’il se passe des choses. Et pour que cela soit encore plus joli, j’aimerais que le dernier message, le plus important (ie. “upload terminé avec succès”), reste affiché quelques secondes. C’est le genre de chose que rx permet de faire très simplement, simplifiant également la concurrence.

 

Voici ma page d’exemple : un toggleswitch permet de déterminer si le prochain message sera un message de fin d’opérations, càd qu’il doit rester affihé quelques secondes puis disparaitre, un bouton pour publier une notification.

<shell:SystemTray.ProgressIndicator> <shell:ProgressIndicator IsIndeterminate="{Binding IsBusy}" IsVisible="{Binding IsBusy}" Text="{Binding BusyMessage}" /> </shell:SystemTray.ProgressIndicator> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <toolkit:ToggleSwitch IsChecked="{Binding NextBusy, Mode=TwoWay}" Content="Next publish is busy ?" /> <Button Grid.Row="1" Content="Publish" Click="Button_Click" /> </Grid>

Pour mes notifications, je vais utiliser une classe portant le message et la valeur de IsBusy (les Tuple manquent cruellement sur WP7 !).

public class BusyNotification { public string BusyMessage { get; set;} public bool IsBusy{get; set;} }

Je vais utiliser une source observable hot (pour mémoire http://blogs.developpeur.org/leo/archive/2012/04/25/reactive-extensions-consommer-des-services-avec-rx-partie-1-cr-er-une-source-observable.aspx) puisqu’elle doit continuer à vivre en tout temps.

private Subject<BusyNotification> _notifications;

Au clic sur le bouton, je publie une notification …

private void Button_Click(object sender, RoutedEventArgs e) { _notifications.OnNext(new BusyNotification { BusyMessage = DateTime.Now.ToLongTimeString(), IsBusy = NextBusy }); }

Le plus intéressant maintenant, je vais observer ma source de deux manières :

- la première prend tous les messages et se contente d’afficher le progress indicator et d’y placer le bon contenu ;

- la seconde va faire un throttle sur les messages (ici de 5 secondes, c’est le temps durant lequel le message restera affiché), ainsi elle ne recevra que le dernier à être passé dans la séquence, puis on filtre sur le fait que IsBusy soit false, càd que le message doit faire disparaitre le progress indicator. Grâce au throttle, si une autre opération venait à être lancée entre temps, alors on reprend des messages avec IsBusy a true, la condition du where n’est pas satisfaite et donc le progress indicator ne disparait pas.

_notifications.ObserveOnDispatcher() .Subscribe(n => { if (!IsBusy) IsBusy = true; BusyMessage = n.BusyMessage; }); _notifications.Throttle(TimeSpan.FromSeconds(5)) .Where(n => !n.IsBusy) .ObserveOnDispatcher() .Subscribe(n => { IsBusy = false; BusyMessage = string.Empty; });

Vous aussi, faîtes des applis plus mieux grâce à rx !

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Classé sous , ,

Les 10 derniers blogs postés

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le il y a 15 heures et 36 minutes

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le il y a 17 heures et 28 minutes

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le il y a 21 heures et 18 minutes

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le il y a 21 heures et 24 minutes

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le il y a 22 heures et 0 minutes

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30