在Windows Phone 7仿真器上,按下硬件后退按钮时,默认行为是关闭当前应用程序。我想覆盖此默认行为,以便导航到我的应用程序中的上一页。
经过一些研究,似乎应该可以通过覆盖OnBackKeyPress方法来实现这一点,如下所示:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
// do some stuff ...
// cancel the navigation
e.Cancel = true;
}
但是,单击后退按钮仍会关闭我的应用程序。在上述方法上设置断点表明它永远不会被调用。我的应用程序退出代码上有另一个断点,此断点 命中。
我需要做些什么来拦截后退按钮吗?
答案 0 :(得分:29)
除非您使用Navigate
方法在应用程序中的页面之间移动,否则似乎无法覆盖OnBackKeyPress方法来拦截后退键。
我以前的导航方法是更改根视觉,例如:
App.Current.RootVisual = new MyPage();
这意味着我可以将所有页面保存在内存中,因此我不需要缓存存储在其中的数据(一些数据是通过网络收集的)。
现在看来我需要在页面框架上实际使用Navigate方法,这会创建我正在导航到的页面的新实例。
(App.Current.RootVisual as PhoneApplicationFrame).Navigate(
new Uri("/MyPage.xaml", UriKind.Relative));
一旦我开始使用此方法导航,我就可以按照我的问题中描述的方式覆盖后退按钮处理......
答案 1 :(得分:23)
如果您不想使用默认的后退键行为,请在OnBackKeyPress的CancelEventArgs参数中设置Cancel = true。在我的页面中,我已经覆盖了后退按钮以关闭Web浏览器控件而不是导航回来。
protected override void OnBackKeyPress(CancelEventArgs e)
{
if (Browser.Visibility == Visibility.Visible)
{
Browser.Visibility = Visibility.Collapsed;
e.Cancel = true;
}
}
答案 2 :(得分: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(它是网格)的Storyboard中,KeyTime设置为“00:00:01”,因为我希望它在滑动(和淡入淡出)视图时保持可见。
注意2:if语句中包含StoryboardHideControlSlider.GetCurrentState() != ClockState.Active
的原因是因为如果用户按两次后退按钮并且Storyboard未完成,它将再次运行。这可以防止后退按钮取消导航回到上一页。换句话说,如果故事板处于活动状态,则代码“知道”用户已经开始隐藏它并打算导航回上一页。 (好吧,至少他们会得到的行为......他们不会看到动画两次)!