Как обработать кнопку возврата на Windows Phone 7 - PullRequest
43 голосов
/ 20 мая 2010

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

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

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 20 мая 2010

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

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

App.Current.RootVisual = new MyPage(); 

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

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

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

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

23 голосов
/ 28 мая 2011

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

    protected override void OnBackKeyPress(CancelEventArgs e)
    {
        if (Browser.Visibility == Visibility.Visible)
        {
            Browser.Visibility = Visibility.Collapsed;
            e.Cancel = true;
        }
    }
3 голосов
/ 05 марта 2011

Я смог использовать эту технику, чтобы сделать то, что я хотел, то есть предотвратить обратную навигацию, скрывая элемент управления, который скользит в окно и из окна. По умолчанию видимость элемента управления свернута. Раскадровки используются для контроля, когда он становится видимым или свернутым. В 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, заключается в том, что если пользователь дважды нажимает кнопку «Назад», а раскадровка не завершена, он запускается снова. Это предотвращает возврат кнопки назад на предыдущую страницу. Другими словами, если раскадровка активна, код «знает», что пользователь уже инициировал ее скрытие, и намеревается вернуться на предыдущую страницу. (Ну, по крайней мере, такое поведение они получат ... и они не увидят анимацию дважды)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...