webdevqa.jp.net

Windows Phone 8.1 Universal Appは、2ページ目から戻ると終了しますか?

Windows Phone 8.1ユニバーサルアプリに2ページあります。

クリックイベントコードでボタンを使用してPage1。xamlからPage2。xamlに移動します。

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();
    }

私の知る限り、バックスタックはクリアしません。

何が起こっているのですか、どうすれば修正できますか?

よろしく、ニールス

26
Niels

これは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
79
Igor Ralic

戻るボタンを押したときに確認ダイアログを表示する場合は、以下のコードをメモしてください

    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();
            }
        }
    }
5
Munchan Park

NavigationHelperの「パターン」ウィッチを使用すると、ライフサイクルイベントを処理することもできます。

NavigationHelperは、Microsoftが提供するクラスで(Windows Phone APIの一部ではありません)、ページを登録でき、NavigationHelperがFrameHistoryを処理します。

NavigationHelperを使用するには、プロジェクトにクラスを追加し、ロード時にNavigationHelperでページを登録する必要があります。 BasicPage(BlankPageではない)をプロジェクトに追加すると、VisualStudioは、NavigationHelperクラスを含むいくつかのヘルパークラスでcommonというフォルダーを追加します。

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);
    }
}

このトピックとライフサイクルイベントを処理する機能の詳細については、この 記事 を読むか、この ビデオ をご覧ください。

1
szuuuken