UWP:我的应用程序上的后退按钮问题

时间:2017-09-13 19:12:50

标签: uwp windows-10-universal back-button

我在信中跟踪了MS的例子,但我仍然遇到一个奇怪的问题。让我解释一下:))

我的应用有3页。主要,添加和帮助。 Main允许使用带有args的.Navigate转到Add。 添加允许转到没有args的.Navigate帮助。 添加允许使用后退按钮或取消按钮返回主界面(取消按钮使用GoBack())。 帮助只能使用后退按钮返回到添加。

我的代码在主页面上非常简单,用于定义后台请求:

在OnNavigatedTo()中:

SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
            SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;

事件处理程序:

private void MainPage_BackRequested(object sender, BackRequestedEventArgs e)
        {
            if (this.Frame.CanGoBack)
            {
                this.Frame.GoBack();
                e.Handled = true;
            }
        }

我的问题如下:

  • 启动app =>行
  • 主要 - >添加 - > Back = Main ==>行
  • 主要 - >添加 - >帮助 - >返回=添加==>行
  • 主要 - >添加 - >帮助 - >返回=添加 - > Back = Main ==>好 THEN
  • 主要 - >添加 - >帮助 - >返回=主要???

调试时,后台堆栈没问题。但是,当我遇到我的问题时,BackRequested事件处理程序确实调用了两次(两次因为我点击" CanGoBack == false"我推测),就像它被卡在循环中一样。 有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

首先,感谢@ mm8和@AVK。 你是对的,这是多次登记的事件。但是在再次添加之前移除Handler确实不适用于我的情况(我不明白为什么全部,因为调试器显示它正在通过" - ="但不是每次我回到主页时,真的将其删除,从而再次循环。

所以,我从@AVK问题(here)中听取了Martin Zikmund的建议,因为它看起来更加清晰。而不是仅仅在OnLaunched结束时添加事件处理程序(基本上,如果你在已经运行的情况下再次启动应用程序,则注册另一个处理程序),我将其添加到if(rootFrame == null){part。这样看起来效果很好。

很遗憾,MS在处理后门按钮时给出的每条建议都是错误的,你认为不是吗?

答案 1 :(得分:1)

确保您只将单个事件处理程序连接到事件。您可以尝试使用-=语法删除任何以前的语法:

SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
var nav = SystemNavigationManager.GetForCurrentView();
nav.BackRequested -= MainPage_BackRequested; //remove any event handler
nav.BackRequested += MainPage_BackRequested;