使用MessageBox取消Page.OnNavigatingFrom中的导航

我有一个两页的WinRT应用程序,第一个导航到第二个.我想问OnNavigatingFrom中的用户是否真的想通过消息框导航到第二个.导航取消是通过设置事件的.Cancel = true来完成的…我可以在消息框完成后执行.

我的问题是MessageDialog.ShowAsync是一个异步方法.

1.
不能做.AsTask().结果……当然会导致死锁.

2.
不能使用await,因为OnNavigatingFrom是void,因此当我等待ShowAsync()时,使它成为异步会导致调用者立即返回.AsTask().结果.

最佳答案 所以我找到了一种方法,它基于这两个答案:

> https://social.msdn.microsoft.com/Forums/en-US/78ba6d55-dd67-4e56-b9f1-137fc6a1e1a7/how-to-block-the-navigation-with-alert?forum=winappswithcsharp
> Frame navigation in xaml return false

基本上,你所做的是你默认取消,然后你显示你的对话框,然后,如果可以导航,你设置一个标志,阻止你将取消设置为true,然后你重新导航到页面.

在它最简单的形式,它看起来像这样.

bool _navigabile = false;
protected async override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (!_navigabile)
    {
        e.Cancel = true;
        var result = true;// await MessageDialog.ShowAsync(/*...*/)

    if (result)
        {
            _navigabile = true;
            var current = Window.Current;
            var frame = current.Content as Frame;

            var ignore = current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                        () => frame.Navigate(e.SourcePageType, e.Parameter));
        }
    }
}
点赞