我有一个两页的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));
}
}
}