Программно отклонить MessageDialog

На Windows Phone 8.1, как программно закрыть MessageDialog после вызова ShowAsync?

Я пытался вызвать IAsyncInfo.Close(), он просто выдает InvalidOperationException "Запрошено незаконное изменение состояния".

Я пытался вызвать IAsyncInfo.Cancel(). Диалоговое окно остается видимым, единственный результат - после того, как я нажму кнопку "Закрыть", TaskCancelledException маршалируется в ожидающую процедуру.

Обновление: точное поведение зависит от последовательности вызовов.

  1. Если IAsyncOperation.Cancel() вызывается раньше await theTask - Ключевое слово await создает исключение TaskCancelledException сразу. Тем не менее, диалог остается видимым.
  2. Если 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, и это не сработало.

Другие вопросы по тегам