Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MessageDialog ShowAsync throws accessdenied exception on second dialog

Tags:

I am trying to implement try again/cancel dialog box in windows 8. The dialog box shows fine the first time, but on clicking try again and failing again, I get a access denied exception on calling ShowAsync. I don't know why, but its strange sometimes the code works fine and I don't get the exception when I put breakpoints. really clueless here

here is the code.

    async void DismissedEventHandler(SplashScreen sender, object e)     {         dismissed = true;         loadFeeds();     }     private async void loadFeeds()     {         await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>         {             try             {                 RSSDataSource rssDataSource = (RSSDataSource)App.Current.Resources["RSSDataSource"];                 if (rssDataSource != null)                 {                     await rssDataSource.DownloadFeeds();                     await rssDataSource.GetFeedsAsync();                 }                  AdDataSource ads = (AdDataSource)App.Current.Resources["AdDataSource"];                  if (ads != null)                 {                     await ads.DownloadAds();                 }                 rootFrame.Navigate(typeof(HomePageView));                  Window.Current.Content = rootFrame;             }             catch             {                 ShowError();             }          });     }     async void ShowError()     {         // There was likely a problem initializing         MessageDialog msg = new MessageDialog(CONNECTION_ERROR_MESSAGE, CONNECTION_ERROR_TITLE);          // Add buttons and set their command handlers         msg.Commands.Add(new UICommand(COMMAND_LABEL_RETRY, new UICommandInvokedHandler(this.CommandInvokedHandler)));         msg.Commands.Add(new UICommand(COMMAND_LABEL_CLOSE, new UICommandInvokedHandler(this.CommandInvokedHandler)));         // Set the command to be invoked when a user presses 'ESC'         msg.CancelCommandIndex = 0;          await msg.ShowAsync();     }      /// <summary>     /// Callback function for the invocation of the dialog commands     /// </summary>     /// <param name="command">The command that was invoked</param>     private void CommandInvokedHandler(IUICommand command)     {         string buttonLabel = command.Label;         if (buttonLabel.Equals(COMMAND_LABEL_RETRY))         {             loadFeeds();         }         else         {             // Close app             Application.Current.Exit();         }     } 
like image 438
Syler Avatar asked Oct 04 '12 07:10

Syler


2 Answers

Okay I found a quick solution,

define a IAsyncOperation class varialble

IAsyncOperation<IUICommand> asyncCommand = null; 

and set it to the ShowAsync method of MessageDialog

asyncCommand = msg.ShowAsync(); 

In the command handler for retry/try again check if asyncCommand is not null and cancel the last operation if necessary

if(asyncCommand != null) {    asyncCommand.Cancel(); } 

Please let me if there is a better approach to this.

like image 173
Syler Avatar answered Sep 19 '22 16:09

Syler


I am late to the party, but here's a way where you can always await the result of the dialog box, as well as not need to worry about calling too many in a row:

First define a static variable and method in your application:

 private static IAsyncOperation<IUICommand> messageDialogCommand = null;  public async static Task<bool> ShowDialog(MessageDialog dlg) {      // Close the previous one out     if (messageDialogCommand != null) {        messageDialogCommand.Cancel();        messageDialogCommand = null;     }      messageDialogCommand = dlg.ShowAsync();     await messageDialogCommand;     return true;  } 

Now, you can pass in any dialog box and always await execution. This is why this returns a bool rather than void. You won't have to worry about collisions between multiples. Why not make this method accept a string? Because of title, and Yes/No command handlers that you may assign into the specific dialog box you are using.

Invoke such as:

await App.ShowDialog(new MessageDialog("FOO!")); 

or

var dlg = new MessageDialog("FOO?", "BAR?"); dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(YesHandler))); dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(NoHandler))); await App.ShowDialog(dlg); 
like image 22
Paul Avatar answered Sep 17 '22 16:09

Paul