以编程方式解散MessageDialog

本文关键字:MessageDialog 方式解 编程 | 更新日期: 2023-09-27 18:08:42

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

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

我已经尝试调用IAsyncInfo.Cancel()。对话框保持可见,唯一的结果-在我点击"关闭"按钮后,TaskCancelledException被封送到等待例程。

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

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

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

以编程方式解散MessageDialog

在RT中就是这样做的。保存该ShowAsync Task,稍后可以取消它。

    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上尝试了这个,它没有工作。