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
Ответы
Ответ 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);
}
}
Для получения дополнительной информации об этой теме и возможности обработки событий жизненного цикла вы можете прочитать эту статью или посмотреть это .