Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Navigation 正在使用MessageBox取消Page.OnNavigatingFrom中的导航_Navigation_Winrt Async - Fatal编程技术网

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

Navigation 正在使用MessageBox取消Page.OnNavigatingFrom中的导航,navigation,winrt-async,Navigation,Winrt Async,我有一个两页的WinRT应用程序,第一页导航到第二页。我想在on Navigating from中询问用户是否真的想通过消息框导航到第二个。通过设置eventargs的.Cancel=true来完成导航取消。。。消息框完成后我可以做的 我的问题是MessageDialog.showsync是一种异步方法 一,。 无法执行.AsTask()。结果。。。这当然会导致僵局 二,。 无法使用wait,因为OnNavigatingFrom是void,因此使其异步会导致调用方在我等待ShowAsync().

我有一个两页的WinRT应用程序,第一页导航到第二页。我想在
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));
}

所以我找到了一种方法,它基于以下两个答案:

基本上,您要做的是在默认情况下取消,然后显示对话框,如果可以导航,则设置一个标志以防止将“取消”设置为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));
        }
    }
}

我认为您的第一个条件应该是
if(!\u navigable)
,而不是
if(\u navigable)
,但除此之外,它似乎有效。