Программно отклонить MessageDialog
На Windows Phone 8.1, как программно закрыть MessageDialog после вызова ShowAsync?
Я пытался вызвать IAsyncInfo.Close(), он просто выдает InvalidOperationException "Запрошено незаконное изменение состояния".
Я пытался вызвать IAsyncInfo.Cancel(). Диалоговое окно остается видимым, единственный результат - после того, как я нажму кнопку "Закрыть", TaskCancelledException маршалируется в ожидающую процедуру.
Обновление: точное поведение зависит от последовательности вызовов.
- Если
IAsyncOperation.Cancel()
вызывается раньшеawait theTask
- Ключевое слово await создает исключение TaskCancelledException сразу. Тем не менее, диалог остается видимым. - Если
await theTask;
вызывается раньшеIAsyncOperation.Cancel()
диалоговое окно остается видимым, но в отличие от #1,await
продолжает ждать нажатия кнопки. Только тогда возбуждается TaskCanceledException.
Кстати, мой сценарий №2: мне нужно иметь возможность закрыть диалоги сообщений после того, как какая-то подпрограмма уже ожидает ее завершения.
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, и это не сработало.