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

时间:2016-02-24 13:09:29

标签: navigation winrt-async

我有一个两页的WinRT应用程序,第一个导航到第二个。我想问OnNavigatingFrom中的用户是否真的想通过消息框导航到第二个用户。通过设置.Cancel=true的{​​{1}}来完成导航取消...我可以在消息框结束后执行此操作。

我的问题是eventargs是一种异步方法。

1。 无法做MessageDialog.ShowAsync ...当然会导致死锁。

2。 无法使用.AsTask().Result,因为awaitOnNavigatingFrom,因此当我等待void时,将其设置为异步会导致调用者立即返回。

2 个答案:

答案 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));
}