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

Windows Phone 8.1 Universal App завершается при переходе со второй страницы?

У меня есть 2 страницы в моем приложении Windows Phone 8.1 Universal.

Я перемещаюсь с Page1.xaml на Page2.xaml с помощью кнопки с кодом события click:

this.Frame.Navigate(typeof(Page2));

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

Я уже пробовал следующее на Page 2:

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

    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
        Frame.GoBack();
    }

Насколько я знаю, я не очищаю задний стек.

Что происходит, и как я могу это исправить?

С уважением, Niels

4b9b3361

Ответ 1

Это новое для Windows Phone 8.1.

Если вы создаете новое универсальное приложение-концентратор с использованием шаблона VS2013, вы увидите класс в общей папке, называемый NavigationHelper.

Этот NavigationHelper дает вам подсказку, как правильно реагировать на нажатие кнопки "Назад". Итак, если вы не хотите использовать NavigationHelper, вот как вернуть прежнее поведение:

public BlankPage1()
{
    this.InitializeComponent();
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        e.Handled = true;
        Frame.GoBack();
    }
}

Вы также можете сделать это на уровне приложения, чтобы избежать необходимости делать это на каждой странице:

public App()
{
    this.InitializeComponent();
    this.Suspending += this.OnSuspending;

    #if WINDOWS_PHONE_APP
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    #endif
}

#if WINDOWS_PHONE_APP
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;

    if (rootFrame != null && rootFrame.CanGoBack)
    {
        e.Handled = true;
        rootFrame.GoBack();
    }
}
#endif

Ответ 2

Если вы хотите отобразить диалоговое окно подтверждения при нажатии кнопки "Назад", обратите внимание на код ниже

    private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        e.Handled = true;
        if (Frame.CanGoBack)
        {
            Frame.GoBack();
        }
        else
        {
            var msg = new MessageDialog("Confirm Close");
            var okBtn = new UICommand("OK");
            var cancelBtn = new UICommand("Cancel");
            msg.Commands.Add(okBtn);
            msg.Commands.Add(cancelBtn);
            IUICommand result = await msg.ShowAsync();

            if (result != null && result.Label == "OK")
            {
                Application.Current.Exit();
            }
        }
    }

Ответ 3

Вы можете использовать шаблон "NavigationHelper", который также поможет вам справляться с событиями lifecyle.

NavigationHelper - это класс, предоставляемый Microsoft (он не является частью Windows Phone API), где вы можете регистрировать свои страницы, и NavigationHelper заботится о FrameHistory.

Чтобы использовать NavigationHelper, вы должны добавить класс в свой проект и зарегистрировать страницы в NavigationHelper при их загрузке. Когда вы добавляете BasicPage (а не BlankPage) в свой проект, VisualStudio добавляет папку, называемую общим с некоторыми вспомогательными классами, включая класс NavigationHelper.

Чтобы зарегистрировать свои страницы в NavigationHelper, вы должны добавить следующий код ко всем страницам, на которые вы хотите перейти к NavigationHelper.

public sealed partial class MySuperCoolPage : Page {
    private readonly NavigationHelper navigationHelper;

    public MySuperCoolPage() {
        InitializeComponent();
        navigationHelper = new NavigationHelper(this);
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e){
        this.navigationHelper.OnNavigatedFrom(e);
    }

    protected override void OnNavigatedTo(NavigationEventArgs e) {
        navigationHelper.OnNavigatedTo(e);
    }
}

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