以编程方式关闭MessageDialog

时间:2014-06-14 18:26:33

标签: c# windows-runtime winrt-xaml windows-phone-8.1 messagedialog

在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。
  3. 顺便说一下,我的方案是#2:我需要能够在一些例程已经等待完成之后关闭消息对话框。

1 个答案:

答案 0 :(得分: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上尝试过这个并没有用。