我在信中跟踪了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;
}
}
我的问题如下:
调试时,后台堆栈没问题。但是,当我遇到我的问题时,BackRequested事件处理程序确实调用了两次(两次因为我点击" CanGoBack == false"我推测),就像它被卡在循环中一样。 有什么想法吗?
感谢。
答案 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;