23

Windows 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();
        }
    }
4

5 に答える 5

25

さて、私は簡単な解決策を見つけました、

IAsyncOperation クラスの変数を定義する

IAsyncOperation<IUICommand> asyncCommand = null;

MessageDialog の ShowAsync メソッドに設定します

asyncCommand = msg.ShowAsync();

再試行/再試行のコマンド ハンドラーで、asyncCommand が null でないかどうかを確認し、必要に応じて最後の操作をキャンセルします

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

これに対するより良いアプローチがあれば教えてください。

于 2012-10-04T09:03:43.917 に答える
9

パーティーに遅れてしまいましたが、次の方法を使用すると、ダイアログ ボックスの結果をいつでも待つことができ、連続して多くの呼び出しを行うことを心配する必要がなくなります。

まず、アプリケーションで静的変数とメソッドを定義します。

 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;
 }

これで、任意のダイアログ ボックスを渡して、常に実行を待機できるようになりました。これが、これが void ではなく bool を返す理由です。倍数間の衝突について心配する必要はありません。このメソッドが文字列を受け入れるようにしないのはなぜですか? タイトルと、使用している特定のダイアログ ボックスに割り当てることができる 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);
于 2014-03-05T22:38:17.690 に答える
3

私は数日前にこの同じ問題に直面していました.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();
}

この助けを願っています!

于 2013-01-31T21:55:17.613 に答える
3

ここで役立つ可能性のある MSDN フォーラムに、これに対する回答があります。

http://social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/c2f5ed68-aac7-42d3-bd59-dbf2673dd89b

私は同様の問題を抱えていますが、私の showAsync 呼び出しは別のスレッドの別の関数にあるため、そこに done() をドロップすることはできません...

于 2012-10-09T20:31:41.400 に答える