如何处理为 UWP 按下的后退按钮

How to handle back button pressed for UWP

我曾经在 Windows Phone 8.1 XAML 中使用硬件按钮 API。但是,在 UWP 中,某些设备没有后退按钮。如何适应新的应用模式?

您可以使用 BackRequested 事件来处理返回请求:

SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;

if (App.MasterFrame.CanGoBack)
{
    rootFrame.GoBack();
    e.Handled = true;
}

稍微解释一下答案。 您可以使用 SystemNavigationManager of Windows.UI.Core 命名空间

对于单页


如果您只想处理单个页面的导航。按照以下步骤

步骤 1。使用命名空间 Windows.UI.Core

using Windows.UI.Core;

步骤2.为当前视图注册返回请求事件。最好的地方是在 InitializeComponent().

之后 class 的主要构造函数
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


处理所有视图的所有后退按钮的最佳位置是 App.xaml.cs

步骤 1。使用命名空间 Windows.UI.Core

using Windows.UI.Core;

步骤2.为当前视图注册返回请求事件。最好的位置是 OnLaunched 就在 Window.Current.Activate

之前
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;
    }
}

参考资料- Handle back button pressed in UWP

希望这对某人有帮助!

上面的代码完全正确,但是你必须在rootFrame变量中添加frame对象。以下给出:

private Frame _rootFrame;
 protected override void OnLaunched(LaunchActivatedEventArgs e)
 { 
        Frame rootFrame = Window.Current.Content as Frame;
        if (Window.Current.Content==null)
        {
            _rootFrame = new Frame();
        }
}

并将此 _rootFrame 传递给 OnBackRequested 方法。喜欢:

 private void OnBackRequested(object sender, BackRequestedEventArgs 
 {
       if (_rootFrame.CanGoBack)
       {
            _rootFrame.GoBack();
            e.Handled = true;
       }
 }