4

在 Windows Phone 8.1 上,如何在 ShowAsync 调用后以编程方式关闭 MessageDialog?

我试过调用 IAsyncInfo.Close(),它只是抛出一个 InvalidOperationException “请求了非法状态更改”。

我试过调用 IAsyncInfo.Cancel()。对话框保持可见,这是唯一的结果 - 在我点击“关闭”按钮后,TaskCancelledException 被编组到等待例程。

更新:确切的行为取决于调用的顺序。

  1. 如果IAsyncOperation.Cancel()之前调用过await theTask- await 关键字会立即抛出 TaskCancelledException。但是,对话框仍然可见。
  2. 如果await theTask;在之前调用过IAsyncOperation.Cancel(),对话框保持可见,但与#1 不同await的是,它会继续等待点击按钮。只有这样才会引发 TaskCanceledException。

顺便说一句,我的场景是#2:在某些例程已经在等待其完成后,我需要能够关闭消息对话框。

4

1 回答 1

1

这就是它在 RT 中的完成方式。保存该 ShowAsync 任务,您可以稍后取消它。

    private IAsyncOperation<IUICommand> dialogTask;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageDialog dlg = new MessageDialog("This will close after 5 seconds");
        try
        {
            dialogTask = dlg.ShowAsync();
        }
        catch (TaskCanceledException)
        {
            //this was cancelled
        }

        DispatcherTimer dt = new DispatcherTimer();
        dt.Interval = TimeSpan.FromSeconds(5);
        dt.Tick += dt_Tick;
        dt.Start();
    }

    void dt_Tick(object sender, object e)
    {
        (sender as DispatcherTimer).Stop();
        dialogTask.Cancel();
    }

注意 ShowAsync() 没有等待。而是保存到可以取消的任务中。可悲的是,我在 WP 上尝试过,但没有成功。

于 2014-06-23T14:59:33.627 回答