以编程方式解散MessageDialog
本文关键字:MessageDialog 方式解 编程 | 更新日期: 2023-09-27 18:08:42
在Windows Phone 8.1上,如何在ShowAsync调用后以编程方式解散MessageDialog ?
我试过调用IAsyncInfo.Close(),它只是抛出InvalidOperationException "请求非法状态更改"。
我已经尝试调用IAsyncInfo.Cancel()。对话框保持可见,唯一的结果-在我点击"关闭"按钮后,TaskCancelledException被封送到等待例程。
Update:的确切行为取决于调用的顺序。
- 如果
IAsyncOperation.Cancel()
在await theTask
之前被调用- await关键字立即抛出TaskCancelledException。但是,对话框仍然可见。 - 如果
await theTask;
在IAsyncOperation.Cancel()
之前被调用,对话框保持可见,但与#1不同,await
继续等待按钮被点击。这时才会引发TaskCanceledException异常。
顺便说一句,我的场景是#2:我需要能够在一些例程已经等待完成后关闭消息对话框。
在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上尝试了这个,它没有工作。