【问题标题】:UWP : Issue with the backbutton on my appUWP:我的应用程序上的后退按钮问题
【发布时间】:2017-09-13 19:12:50
【问题描述】:

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

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

我的代码在主页上定义返回请求非常简单:

在 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;
            }
        }

我的问题如下:

  • 启动应用 => 确定
  • 主要 -> 添加 -> 返回 = 主要 ==> 确定
  • 主要 -> 添加 -> 帮助 -> 返回 = 添加 ==> 确定
  • 主 -> 添加 -> 帮助 -> 返回 = 添加 -> 返回 = 主 ==> 确定 那么
  • 主要 -> 添加 -> 帮助 -> 返回 = 主要 ???

调试的时候,backstack是OK的。但是当我遇到问题时,BackRequested 事件处理程序确实被调用了两次(两次是因为我点击了“CanGoBack == false”,我认为它),就像它卡在一个循环中一样。 有什么想法吗?

谢谢。

【问题讨论】:

  • 我遇到了确切的问题。一年前问questionanswer 为我工作
  • 我很确定它也会为我做这件事,但根据我的阅读,e.Handled = true;应该已经向所有其他事件处理程序(如果它们存在)发出信号,不要处理该事件。我看错了吗?
  • 并非如此。如果您看到我的问题的答案,则提供了解释,并且当时我能够在移动和桌面平台上复制相同的场景。这就是我在两个平台上彻底测试后将其标记为已接受的原因。我希望那时微软的文档能更清楚一点。
  • 确实,还不是很清楚。我在下面说过,非常感谢您,您的帖子非常好:)

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


【解决方案1】:

首先,感谢@mm8 和@AVK。 你是对的,这是多次注册的事件。但是在再次添加之前删除处理程序在我的情况下确实不起作用(而且我不明白为什么,因为调试器显示它正在通过“-=”但并没有真正删除它,因此每次循环一次我回到主页的时间。

所以,我听从了 @AVK 问题 (here) 中 Martin Zikmund 的建议,因为它看起来更干净。我不只是在 OnLaunched 末尾添加事件处理程序(基本上,如果您在应用程序已经运行时再次启动该应用程序,则注册另一个处理程序),我将其添加到 if(rootFrame == null){ 部分。这样看来效果还不错。

很遗憾,MS 在处理后退按钮方面给出的每条建议都是非常错误的,你不觉得吗?

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是个好主意,确实,将处理程序添加到 OnNavigatedTo() 中的事件中,每次我返回主页时,它都会被添加并再次执行操作。但即使之前删除了处理程序(甚至是其中的第 10 个 ^^),它仍然会做同样的事情......顺便说一句,我在我的代码中进行了搜索以验证我没有向这个事件添加另一个处理程序,但是没有。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2020-10-09
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2016-05-06
    • 2015-10-20
    相关资源
    最近更新 更多