如何处理Windows Phone 7上的后退button

在windows phone 7仿真器上,当按下硬件后退button时,默认行为是closures当前的应用程序。 我想覆盖这个默认行为,以便它导航到我的应用程序中的上一页。

经过一番研究,似乎应该可以通过重写OnBackKeyPress方法来做到这一点,就像这样:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { // do some stuff ... // cancel the navigation e.Cancel = true; } 

但是,单击后退button仍会closures我的应用程序。 在上面的方法上放置一个断点就表明它从来没有被调用过。 我的应用程序退出代码有另一个断点,并且这个断点打。

有什么我需要做的拦截后退button?

这似乎是不可能重写OnBackKeyPress方法来拦截返回键,除非您使用Navigate方法在应用程序中的页面之间移动。

我以前的导航方法是改变根目录,如:

 App.Current.RootVisual = new MyPage(); 

这意味着我可以将所有页面保留在内存中,因此我不需要caching存储在其上的数据(某些数据是通过networking收集的)。

现在看来我需要在页面框架上实际使用Navigate方法,这会创build一个我正在浏览的页面的新实例。

 (App.Current.RootVisual as PhoneApplicationFrame).Navigate( new Uri("/MyPage.xaml", UriKind.Relative)); 

一旦我开始使用这种方法进行导航,那么我可以覆盖按照我的问题中所述的方式处理后退button…

如果不想使用默认的后退键行为,请在OnBackKeyPress的CancelEventArgs参数中设置Cancel = true。 在我的页面中,我已经覆盖了后退button来closuresWeb浏览器控件,而不是返回。

  protected override void OnBackKeyPress(CancelEventArgs e) { if (Browser.Visibility == Visibility.Visible) { Browser.Visibility = Visibility.Collapsed; e.Cancel = true; } } 

我能够使用这种技术来做我想做的事情,这是为了防止后退导航,同时隐藏了滑入和滑出窗口的控件。 默认情况下,控件的可见性已折叠。 故事板用于控制何时可见或折叠。 在Storyboard中的XAML中:

 <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ControlScroller" Storyboard.TargetProperty="(UIElement.Visibility)"> <ObjectAnimationUsingKeyFrames.KeyFrames> <DiscreteObjectKeyFrame KeyTime="00:00:00"> <DiscreteObjectKeyFrame.Value> <Visibility>Visible</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames.KeyFrames> 

然后在页面的代码中:

 protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { if(ControlScroller.Visibility == Visibility.Visible && StoryboardHideControlSlider.GetCurrentState() != ClockState.Active) { StoryboardHideControlSlider.Begin(); ContentGrid.IsHitTestVisible = true; e.Cancel = true; } } 

注意:在隐藏ContentScroller(网格)的Storyboard中,KeyTime被设置为“00:00:01”,因为我希望它在滑动(和淡入淡出)时保持可见。

注2:if语句中包含了StoryboardHideControlSlider.GetCurrentState() != ClockState.Active的原因是因为如果用户点击后退button两次,故事板没有完成,它将再次运行。 这可以防止后退取消导航回到前一页。 换句话说,如果Storyboard处于活动状态,则代码“知道”用户已经发起隐藏它,并打算导航回到上一页。 (至less,这是他们将要得到的行为,他们不会看到animation两次)!