我有一个两页的WinRT应用程序,第一个导航到第二个。我想问OnNavigatingFrom
中的用户是否真的想通过消息框导航到第二个用户。通过设置.Cancel=true
的{{1}}来完成导航取消...我可以在消息框结束后执行此操作。
我的问题是eventargs
是一种异步方法。
1。
无法做MessageDialog.ShowAsync
...当然会导致死锁。
2。
无法使用.AsTask().Result
,因为await
为OnNavigatingFrom
,因此当我等待void
时,将其设置为异步会导致调用者立即返回。
答案 0 :(得分:1)
所以我找到了一种方法,它基于这两个答案:
基本上,你所做的是你默认取消,然后你显示你的对话框,然后,如果它可以导航,你设置一个标志,阻止你将取消设置为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));
}
}
}
答案 1 :(得分:0)
无法从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));
}