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();
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();
}
}
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;
}
}
_
これが誰かに役立つことを願っています!
次の手順に従ってください:
以下のように、ページに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
を使用する必要がある場合があります。
これがお役に立てば幸いです。
これを試してください。これは、フレームバックナビゲーションで機能します。
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();
}
}
}