TIPS & TRICKS : Erreur « Access Denied » avec MessageDialog (WinRT)
Une application Windows 8 se doit de tester si le réseau est disponible, et dans le cas contraire afficher un message d’erreur du style.
Code Snippet
- void DemoMessageDialogStandard()
- {
- if (NetworkInterface.GetIsNetworkAvailable())
- {
- //Se connecte internet et rapatrie des donnes
- }
- else
- {
- ShowNotConnectedMessage();
- }
- }
- void ReEssayer(Object userState)
- {
- DemoMessageDialogStandard();
- }
- async voidShowNotConnectedMessage()
- {
- MessageDialog dialogError = new MessageDialog("Vous n'etes pas connect", "Erreur de connexion");
- IUICommand tryAgainCommand = new UICommand("r-essayer", ReEssayer);
- dialogError.Commands.Add(tryAgainCommand);
- dialogError.DefaultCommandIndex = 0;
- await dialogError.ShowAsync();
- }
- }
Néanmoins, si la méthode ShowNotConnectedMessage est rappelée une nouvelle fois, à partir de la méthode ReEssayer (pour le cas ou la connexion n’est toujours pas établie) , on obtient le magnifique message suivant :
Voici donc une classe MessageDialogEx, pour résoudre ce problème, à base de sémaphore et de pile concurrente pour éviter la réentrance sur la boite de dialogue.
Code Snippet
- class MessageDialogEx
- {
- static ConcurrentStack<MessageDialog> _dialogs = new ConcurrentStack<MessageDialog>();
- MessageDialog _dlg;
- static SemaphoreSlim semaphore = new SemaphoreSlim(1);
- public MessageDialogEx(String content, String title)
- {
- _dlg = new MessageDialog(content, title);
- _dialogs.Push(_dlg);
- }
- public async Task ShowAsync()
- {
- MessageDialog dlg;
- await semaphore.WaitAsync();
- _dialogs.TryPop(out dlg);
- await dlg.ShowAsync();
- semaphore.Release(1);
- }
- public IList<IUICommand> Commands
- {
- get { return _dlg.Commands; }
- }
- public uint DefaultCommandIndex
- {
- get
- {
- return _dlg.DefaultCommandIndex;
- }
- set
- {
- _dlg.DefaultCommandIndex = value;
- }
- }
- }
Il suffit alors juste de remplacer dans la méthode ShowNotConnectedMessage, MessageDialog par MessageDialogEx
Code Snippet
- async voidShowNotConnectedMessage()
- {
- MessageDialogEx dialogError = new MessageDialogEx("Vous n'etes pas connect", "Erreur de connexion");
- IUICommand tryAgainCommand = new UICommand("r-essayer", ReEssayer);
- dialogError.Commands.Add(tryAgainCommand);
- dialogError.DefaultCommandIndex = 0;
- await dialogError.ShowAsync();
- }
Eric Vernié
Comments
Anonymous
September 20, 2012
I don't know French, but your post helped me :-). thank you !Anonymous
March 04, 2014
Hello, Chouette implémentation merci :-) Je cherchais à résoudre ce problème mais ma version était plus "usine à gaz". Je remplacerais par contre le ConcurrentStack par un ConcurrentQueue histoire de dépiler les messages dans l'ordre d'arrivée (si par exemple 3 sont envoyés "à la suite").