web-dev-qa-db-ja.com

戻るナビゲーションウィンドウ10(UWP)の処理

Xamlページにフレームがあります。

フレーム内を移動するだけのbackButtonイベントを作成しようとしています。

だから私はこのコードを使ってみました

public MainPage(){
    this.InitializeComponent();
    if(Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) {
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }
}
private void HardwareButtons_BackPressed(object sender,BackPressedEventArgs e) {
    if(insideFrame.CanGoBack())insideFrame.GoBack();
    else  Application.Current.Exit();
}

しかし、電話でHardwareButtons_BackPressedイベントを実行した後、アプリケーションを閉じます。

MainPageでいくつかのデフォルトの戻るボタン動作を実行しているようです...

どうすれば修正できますか?そして、Windows10では、バックナビゲーションを処理するために新しいイベントを追加しますか?


[更新]

Windows 10では、Input.HardwareButtons.BackPressedの代わりにSystemNavigationManagerを使用する方がよいことがわかりました。

SystemNavigationManager currentView = SystemNavigationManager.GetForCurrentView();
15
Shahriar

BackPressedEventArgsのHandledプロパティをtrueに設定して、バックボタンの押下を処理したことをシステムに通知する必要があります。

  private void OnHardwareButtonsBackPressed(object sender, BackPressedEventArgs e)
  {
        // This is the missing line!
        e.Handled = true;

        // Close the App if you are on the startpage
        if (mMainFrame.CurrentSourcePageType == typeof(Startpage))
            App.Current.Exit();

        // Navigate back
        if (mMainFrame.CanGoBack)
        {
            mMainFrame.GoBack();
        }
  }
7
Tobias Hoefer

Windows 10(UWP)には、ナビゲーション専用の_Windows.UI.Core_名前空間に SystemNavigationManager が含まれています。

SystemNavigationManagerは_Windows Universal Platform_の一部であるため、モバイルやPCを含むWindows 10で実行されているすべてのデバイスファミリーでサポートされています。

単一ページの場合


単一ページのナビゲーションを処理したいだけの場合。次の手順に従ってください

ステップ1。名前空間を使用する_Windows.UI.Core_

_using Windows.UI.Core;
_

ステップ2。現在のビューのリクエスト要求イベントを登録します。これに最適な場所は、InitializeComponent()の後のクラスのメインコンストラクタです。

_public MainPage()
{
    this.InitializeComponent();
    //register back request event for current view
    SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;
}
_

ステップ3。BackRequestedイベントを処理します

_private void Food_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        Frame.GoBack();
        e.Handled = true;
    }
}
_

単一のrootFrameの1つの場所での完全なアプリケーションの場合


すべてのビューのすべての戻るボタンを処理するのに最適な場所は_App.xaml.cs_です。

ステップ1。名前空間を使用する_Windows.UI.Core_

_using Windows.UI.Core;
_

ステップ2。現在のビューのリクエスト要求イベントを登録します。これに最適な場所は、_Window.Current.Activate_の直前のOnLaunchedです。

_protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    ...
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
    Window.Current.Activate();
}
_

ステップ3。BackRequestedイベントを処理します

_private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}
_

参照- WPで[戻る]ボタンが押された場合

これが誰かに役立つことを願っています!

21

次の手順に従ってください:

  • 以下のように、ページに2つのグローバル変数を追加します。

    private NavigationHelper navigationHelper;
    private RelayCommand _GoBackCommand;
    
  • 次に、特定のページのコンストラクターに以下のコードを追加します。

        // below code is to override the back navigation
        // hardware back button press event from navigationHelper
        _GoBackCommand = new RelayCommand
            (
                () => this.CheckGoBack(),
                () => this.CanCheckGoBack()
            );
    
        navigationHelper.GoBackCommand = _GoBackCommand;
        // ---------
    
  • 次に、コンストラクターで宣言したばかりの両方のメソッドを追加します。

    private bool CanCheckGoBack()
    {
        // this should be always true to make sure the app handles back buton manually.
        return true;
    }
    
    private void CheckGoBack()
    {
        // this will be execute when back button will be pressed
    }
    

ps。 -このため、新しいページを追加するときにBasicPageではなくBlankPageを使用する必要がある場合があります。

これがお役に立てば幸いです。

0
Keval Langalia

これを試してください。これは、フレームバックナビゲーションで機能します。

  protected override void OnNavigatedTo(NavigationEventArgs e)
    {

      HardwareButtons.BackPressed += HardwareButtons_BackPressed;

    }


    void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {

    Frame rootFrame = Window.Current.Content as Frame;

        if (Frame.CanGoBack)
        {
            e.Handled = true;
            Frame.GoBack();
        }
    }

}
0
Husain Ahamed