MessageDialog ShowAsync выдает исключение accessdenied во втором диалоговом окне
Я пытаюсь реализовать диалоговое окно try again/cancel в окнах 8. Диалоговое окно отображается в первый раз, но при повторном повторном попытке и сбое снова я получаю исключение, исключающее доступ, при вызове ShowAsync.
Я не знаю, почему, но его странный код иногда работает нормально, и я не получаю исключения, когда устанавливаю точки останова. действительно невежественный здесь
вот код.
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();
}
}
Ответы
Ответ 1
Хорошо, я нашел быстрое решение,
определить класс IAsyncOperation varialble
IAsyncOperation<IUICommand> asyncCommand = null;
и установите его в метод ShowAsync MessageDialog
asyncCommand = msg.ShowAsync();
В обработчике команд для повторной попытки/повторите попытку
проверьте, не является ли asyncCommand недействительным и отменит последнюю операцию, если необходимо
if(asyncCommand != null)
{
asyncCommand.Cancel();
}
Пожалуйста, позвольте мне, если есть лучший подход к этому.
Ответ 2
Я опаздываю на вечеринку, но здесь вы всегда можете дождаться результата диалогового окна, а также не нужно беспокоиться о вызове слишком много подряд:
Сначала определите статическую переменную и метод в вашем приложении:
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;
}
Теперь вы можете перейти в любое диалоговое окно и всегда ждать исполнения. Вот почему это возвращает bool, а не void. Вам не придется беспокоиться о столкновениях между мультипликаторами. Почему бы не заставить этот метод принять строку? Из-за заголовка и обработчиков команд Yes/No, которые вы можете назначить в конкретное диалоговое окно, которое вы используете.
Вызвать, например:
await App.ShowDialog(new MessageDialog("FOO!"));
или
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);
Ответ 3
Для этого есть ответы на форуме MSDN, которые могут вам помочь.
http://social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/c2f5ed68-aac7-42d3-bd59-dbf2673dd89b
У меня такая же проблема, но мои вызовы showAsync находятся в отдельных функциях в отдельных потоках, поэтому я не могу отказаться от сделанного() там, я не думаю...
Ответ 4
Я столкнулся с этой проблемой еще несколько дней назад, и я решил ее дождаться ShowAsync, а затем сделал рекурсивный вызов, который снова откроет MessageDialog.
public async void ShowDlg(){
Action cmdAction = null;
var msgDlg = new MessageDialog("Content.", "Title");
msgDlg.Commands.Add(new UICommand("Retry", (x) => {
cmdAction = () => ShowDlg();
}));
msgDlg.Commands.Add(new UICommand("Cancel", (x) => {
cmdAction = () => <Action associated with the cancel button>;
}));
msgDlg.DefaultCommandIndex = 0;
msgDlg.CancelCommandIndex = 1;
await msgDlg.ShowAsync();
cmdAction.Invoke();
}
Надеюсь на эту помощь!
Ответ 5
Другое решение:
private bool _messageShowing = false;
// ...
if (!_messageShowing)
{
_messageShowing = true;
var messageDialog = new MessageDialog("Example");
// ... "messageDialog" initialization
Task<IUICommand> showMessageTask = messageDialog.ShowAsync().AsTask();
await showMessageTask.ContinueWith((showAsyncResult) =>
{
_messageShowing = false;
});
}