2010-05-20 110 views
43

在windows phone 7仿真器上,当按下硬件后退按钮时,默认行为是让它关闭当前应用程序。我想重写此默认行为,以便它导航到我的应用程序中的上一页。如何处理Windows Phone 7上的后退按钮

经过一番研究,现在看来,这应该是可以通过重写OnBackKeyPress方法,像这样做:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    // do some stuff ... 

    // cancel the navigation 
    e.Cancel = true; 
} 

但是,单击后退按钮仍然关闭我的申请。在上述方法上放置一个断点表明它永远不会被调用。我在我的应用程序退出代码上有另一个断点,并且此断点命中。

我还需要做些什么来拦截后退按钮?

+2

从我的MainPage.xaml重写OnBackKeyPress()并调用e.Cancel对我来说工作得很好。 – BrokeMyLegBiking 2010-12-20 04:13:30

+0

可以处理后退按钮,[查看我的这个帖子答案] [1] [1]:http://stackoverflow.com/questions/8975822/prompt-confirmation-dialog-when-exit -app/8977078#8977078 – Santhu 2012-01-27 10:46:03

回答

29

似乎无法重写OnBackKeyPress方法来拦截后退键,除非您使用Navigate方法在应用程序中的页面之间移动。

我以前的导航的方法是改变根视觉,如:

App.Current.RootVisual = new MyPage(); 

这意味着我可以把我的内存中的所有页面,所以我并不需要缓存上存储的数据(一些的数据是通过网络收集的)。

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

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

一旦我开始使用这种方法,我可以再覆盖在我的问题描述的方式返回按钮操作导航...

+0

事实上,如果您使用导航,然后覆盖后退按钮,那么您可以实现一个新的行为(自己检查!)。 – RoguePlanetoid 2010-05-20 18:34:56

+0

有没有*任何其他方式来做到这一点?如果所有的交互都在一个页面上完成呢?那么是否无法覆盖后退按钮? – 2010-12-13 13:35:52

+0

我建议在应用程序启动时导航到您的主页面的“dummy”页面,这样您可以覆盖主页面中的后退按钮。 – Pking 2013-02-14 11:23:18

3

我能够使用这种技术做我想要的东西,这是为了防止后退导航,同时隐藏了滑入和滑出窗口的控件。默认情况下,控件的可见性已折叠。故事板用于控制何时可见或折叠。在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(这是一个网格),该KeyTime是设置为“00:00:01”,因为我希望它在滑动(和淡入淡出)时保持可见状态。

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

23

如果您不想使用默认的后退键行为,请在OnBackKeyPress的CancelEventArgs参数中设置Cancel = true。在我的页面中,我重写了后退按钮来关闭Web浏览器控件,而不是返回。

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