Подтвердить что ты не робот

Как обращаться с кнопкой "Назад" на Windows Phone 7

На эмуляторе Windows Phone 7, когда нажата кнопка назад, по умолчанию используется для закрытия вашего текущего приложения. Я хочу переопределить это поведение по умолчанию, чтобы оно переходило на предыдущую страницу в моем приложении.

После некоторых исследований кажется, что это можно сделать, переопределив метод OnBackKeyPress, например:

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

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

Однако нажатие кнопки "Назад" по-прежнему закрывает мое приложение. Постановка контрольной точки на описанный выше метод показывает, что она никогда не называется. У меня есть другая точка останова на моем коде выхода приложения, и эта точка останова ударяется.

Есть ли что-то еще, что мне нужно сделать, чтобы перехватить кнопку "Назад"?

4b9b3361

Ответ 1

Похоже, что невозможно перекрыть метод OnBackKeyPress, чтобы перехватить обратный ключ, если вы не используете метод Navigate для перемещения между страницами в вашем приложении.

Мой предыдущий метод навигации состоял в том, чтобы изменить корневую визуализацию, например:

App.Current.RootVisual = new MyPage(); 

Это означало, что я мог хранить все мои страницы в памяти, поэтому мне не нужно кэшировать данные, хранящиеся на них (некоторые данные собираются через сеть).

Теперь мне кажется, что мне нужно использовать метод Navigate на кадре страницы, который создает новый экземпляр страницы, на которую я перемещаюсь.

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

Как только я начал навигацию с использованием этого метода, я мог бы затем переопределить обратную кнопку управления способом, описанным в моем вопросе...

Ответ 2

Если вы не хотите поведения по умолчанию по умолчанию, установите Cancel = true в параметре CancelEventArgs в OnBackKeyPress. На моей странице я переопределил кнопку "Назад", чтобы закрыть элемент управления веб-браузера, а не вернуться назад.

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

Ответ 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: Причина StoryboardHideControlSlider.GetCurrentState() != ClockState.Active включена в оператор if, потому что если пользователь дважды нажимает кнопку "Назад", а "Раскадровка" еще не завершена, она снова запустится. Это предотвращает отмена навигации назад к предыдущей странице. Другими словами, если Storyboard активен, код "знает", что пользователь уже начал скрывать его и намеревается вернуться на предыдущую страницу. (Ну, по крайней мере, такое поведение они собираются получить... и они не будут видеть анимацию дважды)!