Navigation 正在使用MessageBox取消Page.OnNavigatingFrom中的导航
我有一个两页的WinRT应用程序,第一页导航到第二页。我想在Navigation 正在使用MessageBox取消Page.OnNavigatingFrom中的导航,navigation,winrt-async,Navigation,Winrt Async,我有一个两页的WinRT应用程序,第一页导航到第二页。我想在on Navigating from中询问用户是否真的想通过消息框导航到第二个。通过设置eventargs的.Cancel=true来完成导航取消。。。消息框完成后我可以做的 我的问题是MessageDialog.showsync是一种异步方法 一,。 无法执行.AsTask()。结果。。。这当然会导致僵局 二,。 无法使用wait,因为OnNavigatingFrom是void,因此使其异步会导致调用方在我等待ShowAsync().
on Navigating from
中询问用户是否真的想通过消息框导航到第二个。通过设置eventargs
的.Cancel=true
来完成导航取消。。。消息框完成后我可以做的
我的问题是MessageDialog.showsync
是一种异步方法
一,。
无法执行.AsTask()。结果
。。。这当然会导致僵局
二,。
无法使用
wait
,因为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));
}
所以我找到了一种方法,它基于以下两个答案:
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));
}
}
}
我认为您的第一个条件应该是
if(!\u navigable)
,而不是if(\u navigable)
,但除此之外,它似乎有效。