UWP:我的应用程序上的后退按钮有问题
UWP : Issue with the backbutton on my app
我按照信中的 MS 示例进行操作,但仍然遇到一个奇怪的问题。让我解释一下:)
我的应用程序有 3 个页面。主要、添加和帮助。
Main 允许使用 .Navigate with args 去添加。
添加允许使用不带参数的 .Navigate 转到帮助。
Add 允许使用后退按钮或取消按钮返回 Main(取消按钮使用 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;
}
}
我的问题如下:
- 启动应用程序 => 确定
- 主要 -> 添加 -> 返回 = 主要 ==> OK
- 主要 -> 添加 -> 帮助 -> 返回 = 添加 ==> 确定
- Main -> Add -> Help -> Back = Add -> Back = Main ==> OK
那么
- 主要 -> 添加 -> 帮助 -> 返回 = 主要 ???
调试的时候,backstack是可以的。但是当我遇到我的问题时,BackRequested 事件处理程序确实被调用了两次(两次是因为我假设我点击了 "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 问题 () 中 Martin Zikmund 的建议,因为它看起来干净多了。而不是仅仅在 OnLaunched 的末尾添加事件处理程序(基本上,如果您在应用程序已经 运行 时再次启动该应用程序,您将注册另一个处理程序),我将其添加到 if(rootFrame == null ){ 部分。这样看来效果还不错。
遗憾的是,MS 给出的关于处理后退按钮的每条建议都是错误的,你不觉得吗?
我按照信中的 MS 示例进行操作,但仍然遇到一个奇怪的问题。让我解释一下:)
我的应用程序有 3 个页面。主要、添加和帮助。 Main 允许使用 .Navigate with args 去添加。 添加允许使用不带参数的 .Navigate 转到帮助。 Add 允许使用后退按钮或取消按钮返回 Main(取消按钮使用 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;
}
}
我的问题如下:
- 启动应用程序 => 确定
- 主要 -> 添加 -> 返回 = 主要 ==> OK
- 主要 -> 添加 -> 帮助 -> 返回 = 添加 ==> 确定
- Main -> Add -> Help -> Back = Add -> Back = Main ==> OK 那么
- 主要 -> 添加 -> 帮助 -> 返回 = 主要 ???
调试的时候,backstack是可以的。但是当我遇到我的问题时,BackRequested 事件处理程序确实被调用了两次(两次是因为我假设我点击了 "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 问题 (
遗憾的是,MS 给出的关于处理后退按钮的每条建议都是错误的,你不觉得吗?