我有一个两页的WinRT应用程序,第一个导航到第二个。我想问OnNavigatingFrom
中的用户是否真的想通过消息框导航到第二个。导航取消是通过设置eventargs
.Cancel=true
来完成的...我可以在消息框完成后执行。
我的问题是MessageDialog.ShowAsync
是一种异步方法。
1.不能做.AsTask().Result
...这当然会导致僵局。
阿拉伯数字。不能使用await
,因为OnNavigatingFrom
是void
的,所以让它异步会导致调用者在我等待ShowAsync().AsTask().Result
时立即返回。
从 OnNavigatingFrom(NavigatingCancelEventArgs e) 事件处理程序异步取消导航。
如果要阻止用户导航离开,则必须在请求导航之前显示对话框。
var dialog = new MessageDialog("Navigate away ?");
var okCommand = new UICommand("OK");
var cancelCommand = new UICommand("Cancel");
dialog.Commands.Add(okCommand);
dialog.Commands.Add(cancelCommand);
var result = await dialog.ShowAsync();
if(result == okCommand)
{
(Window.Current.Content as Frame).Navigate(typeof(BlankPage1));
}
所以我找到了一种方法来做到这一点,它基于这两个答案:
-
https://social.msdn.microsoft.com/Forums/en-US/78ba6d55-dd67-4e56-b9f1-137fc6a1e1a7/how-to-block-the-navigation-with-alert?forum=winappswithcsharp
-
xaml 中的帧导航返回 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));
}
}
}