Что эквивалентно OnBackKeyPress

В Windows Phone 8.0 я использовал это для обработки кнопки «Назад»:

protected override void OnBackKeyPress(CancelEventArgs e)
{
    base.OnBackKeyPress(e);        
}

Это событие не существует в элементе управления «Страница». Как я могу обработать нажатие кнопки «Назад» в WP 8.1?


person Roman    schedule 16.04.2014    source источник


Ответы (3)


Взгляните на Windows. Phone.UI.Input.HardwareButtons.

Если вы добавите базовую страницу в свой проект, тогда VS добавит в ваш проект класс NavigationHelper, который помогает с навигацией по вашему приложению, вы также можете увидеть в исходном коде, что он подписывается на Windows.Phone.UI.Input.HardwareButtons.BackPressed.


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

person Romasz    schedule 16.04.2014
comment
Имеет ли значение, что в документации указано, что этот API поддерживается только в нативных приложениях? - person Lukkha Coder; 16.04.2014
comment
Спасибо за эту подсказку. - person Roman; 17.04.2014
comment
@Roman Я добавил ссылку на другой ответ, который может вас заинтересовать - помогает справиться с BackButton, предотвратить навигацию и многое другое. - person Romasz; 05.05.2014
comment
@LukkhaCoder Вы не сможете использовать его с Windows Phone 8.1 Silverlight. - person Romasz; 05.05.2014
comment
@Nanoc Верно, MSDN также говорит об этом. Вопрос был про WP8.1 Runtime. - person Romasz; 03.07.2014
comment
Отличный совет, его все еще можно использовать в общем коде, когда вы окружаете проводку события оператором компилятора #if WINDOWS_PHONE_APP. - person caschw; 27.10.2014

Вы можете использовать Windows.Phone. UI.Input.HardwareButtons, как комментарий выше. Но это событие всегда выбрасывается на каждой странице. Таким образом, вы можете использовать приведенный ниже пример, и это только на активной странице.


protected override void OnNavigatedTo(NavigationEventArgs e)
{
    Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
    e.Handled = true;
    Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed;
    // Navigate to a page
}

Я решаю свою проблему таким образом.

person hakanaltindis    schedule 22.04.2014
comment
Это сработало для меня в универсальном приложении. Однако мне нужно было вложить его в операторы #if WINDOWS_PHONE_APP. - person Yosem; 02.08.2014
comment
Не следует ли удалить событие HardwareButtons_BackPressed в OnNavigatedFrom? - person Elektropepi; 04.01.2015
comment
Почему бы и нет? Если вы не удаляете и не добавляете к нему новое событие на новой странице, два события запускаются, когда вы нажимаете кнопку «Назад». - person hakanaltindis; 26.01.2015

Я переношу свой проект wp8 на универсальный wp8.1, поэтому, чтобы не слишком сильно трогать мой код, я делаю:

В моем базовом классе страницы в конструкторе я добавил:

 public VBasePage()
    {
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    } 

А потом:

private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        var args = new CancelEventArgs();
        OnBackKeyPress(args);
        if (args.Cancel)
        {
            e.Handled = true;
        }
    }
protected virtual void OnBackKeyPress(CancelEventArgs e)
    {
    }

Поэтому я могу использовать свои текущие переопределения для метода OnBackKeyPress.

person moledj    schedule 01.09.2014