43

在 windows phone 7 模拟器上,当按下硬件后退按钮时,默认行为是关闭您当前的应用程序。我想覆盖此默认行为,以便它导航到我的应用程序中的上一页。

经过一些研究,似乎应该可以通过覆盖 OnBackKeyPress 方法来做到这一点,如下所示:

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

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

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

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

4

3 回答 3

29

Navigate除非您使用该方法在应用程序的页面之间移动,否则似乎无法覆盖 OnBackKeyPress 方法来拦截后退键。

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

App.Current.RootVisual = new MyPage(); 

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

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

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

一旦我开始使用这种方法进行导航,我就可以按照我的问题中描述的方式覆盖后退按钮处理......

于 2010-05-20T15:50:09.510 回答
23

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

    protected override void OnBackKeyPress(CancelEventArgs e)
    {
        if (Browser.Visibility == Visibility.Visible)
        {
            Browser.Visibility = Visibility.Collapsed;
            e.Cancel = true;
        }
    }
于 2011-05-28T00:10:25.950 回答
3

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

<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:原因 StoryboardHideControlSlider.GetCurrentState() != ClockState.Active包含在 if 语句中是因为如果用户按两次后退按钮并且情节提要尚未完成,它将再次运行。这可以防止后退按钮取消导航回到上一页。换句话说,如果 Storyboard 处于活动状态,代码“知道”用户已经开始隐藏它并打算导航回上一页。(嗯,至少这是他们会得到的行为......他们不会看到动画两次)!

于 2011-03-05T16:33:03.723 回答