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



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

我的问题是MessageDialog.ShowAsync是一种异步方法。

1.不能做.AsTask().Result...这当然会导致僵局。

阿拉伯数字。不能使用await,因为OnNavigatingFromvoid的,所以让它异步会导致调用者在我等待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));
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新