UWP:我的应用程序上的backbutton出现问题

UWP:我的应用程序上的backbutton出现问题,uwp,windows-10-universal,back-button,Uwp,Windows 10 Universal,Back Button,我在信中引用了MS的例子,但我仍然遇到了一个奇怪的问题。让我解释一下:) 我的应用程序有3个页面。Main、Add和Help。 Main允许使用进行添加。使用args导航。 添加允许转到帮助。导航时不使用参数。 Add允许使用backbutton或cancel按钮返回Main(cancel按钮使用GoBack()。 帮助只能使用backbutton返回添加 我的代码在主页上非常简单,可以定义back请求: 在OnNavigatedTo()中: 事件处理程序: private void MainP

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

我的应用程序有3个页面。Main、Add和Help。 Main允许使用进行添加。使用args导航。 添加允许转到帮助。导航时不使用参数。 Add允许使用backbutton或cancel按钮返回Main(cancel按钮使用GoBack()。 帮助只能使用backbutton返回添加

我的代码在主页上非常简单,可以定义back请求:

在OnNavigatedTo()中:

事件处理程序:

private void MainPage_BackRequested(object sender, BackRequestedEventArgs e)
        {
            if (this.Frame.CanGoBack)
            {
                this.Frame.GoBack();
                e.Handled = true;
            }
        }
我的问题如下:

  • 启动应用程序=>OK
  • 主->添加->返回=主==>确定
  • 主->添加->帮助->返回=添加==>确定
  • 主->添加->帮助->返回=添加->返回=主==>确定 然后
  • 主->添加->帮助->返回=主
调试时,backback正常。但是当我遇到我的问题时,backrequest事件处理程序确实被调用了两次(两次是因为我假设遇到了“CanGoBack==false”),就像它被卡在了一个循环中一样。 有什么想法吗


谢谢。

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

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

首先,感谢@mm8和@AVK。 你说得对,这是一个多次登记的事件。但在我的情况下,在再次添加处理程序之前删除处理程序确实不起作用(我完全不理解为什么,因为调试器显示它正在通过“-=”但没有真正删除它,因此每次我返回主页时都会再次循环

因此,我遵循了@AVK question()中Martin Zikmund的建议,因为它看起来更干净了。我没有仅仅在OnLaunched的末尾添加事件处理程序(基本上,如果在应用程序运行时再次启动,则需要注册另一个处理程序),而是在if(rootFrame==null)中添加了它{部分。这样看来效果不错


遗憾的是,MS在处理backbutton时给出的每一条建议都是非常错误的,你不认为吗?

我有一个确切的问题。一年前被问到并为meI工作时,我非常肯定它也会为我做这件事,但从我所读到的,e.Handled=true;应该已经向所有其他事件处理程序发出信号(如果存在的话)不处理该事件。我读错了吗?不完全是。如果你看到我问题的答案,就会给出解释,我当时能够在移动和桌面平台上复制相同的场景。这就是为什么我在两个平台上彻底测试后将其标记为接受的原因。我希望Microsoft文档能够在这一点上要更清楚一点。事实上,它不是那么清楚。我在下面说,非常感谢,你的帖子真的很好:)这是一个好主意,事实上,在OnNavigatedTo()中将处理程序添加到事件中,每次我回到主页,它都会被添加并再次执行操作。但即使之前删除了处理程序(即使是第10个^^^)它仍然是一样的…顺便说一句,我在代码中进行了搜索,以验证我没有向该事件添加其他处理程序,但没有。无论如何,谢谢。
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
var nav = SystemNavigationManager.GetForCurrentView();
nav.BackRequested -= MainPage_BackRequested; //remove any event handler
nav.BackRequested += MainPage_BackRequested;