BackButton事件关闭应用程序Windows 10应用程序

时间:2015-10-16 04:16:01

标签: c# xaml windows-10

我目前正在为Windows 10开发一个应用程序。我想在我的应用程序上实现一个后退按钮事件。当我按下Frame1上的后退按钮时,应用程序将关闭,这正如我想要的那样。当我在Frame2,并导航到Frame3,然后按后退按钮,应用程序自行关闭。

我想要的是Frame3上的后退按钮事件使Frame3返回到Frame2,当我按下Frame2上的后退按钮时,终止应用程序。

在我的App.xaml.cs

protected override void OnLaunched(LaunchActivatedEventArgs e)
    {

        if (System.Diagnostics.Debugger.IsAttached)
        {
            this.DebugSettings.EnableFrameRateCounter = true;
        }

        Frame rootFrame = Window.Current.Content as Frame;

        if (rootFrame == null)
        {
            rootFrame = new Frame();

            rootFrame.NavigationFailed += OnNavigationFailed;

            if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                //TODO: Load state from previously suspended application
            }

            // Place the frame in the current Window
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter
            rootFrame.Navigate(typeof(Frame1), e.Arguments);
        }
        // Ensure the current window is active
        Window.Current.Activate();
    }

在我的Frame1.xaml.cs上:

private void 1_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
    {
        Frame frame1 = Window.Current.Content as Frame;
        if (frame1 != null)
        {
            e.Handled = true;
            Application.Current.Exit();
        }
    }

在我的Frame2.xaml.cs上:

private void 2_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
    {
        Frame frame2= Window.Current.Content as Frame;
        if (frame2 != null)
        {
            e.Handled = true;
            Application.Current.Exit();
        }
    }

在我的Frame3.xaml.cs上:

private void 3_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
    {
        Frame frame3= Window.Current.Content as Frame;

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

1 个答案:

答案 0 :(得分:2)

那是因为您添加到BackPressed事件的事件处理程序将按FIFO顺序触发,因此您的事件根据您的代码处理堆栈是:

当你在Page1:

  

1.关闭应用

导航到Page2:

  

1.关闭应用

     

2.关闭应用

从Page2导航到Page3时:

  

1.关闭应用

     

2.关闭应用

     

3.Goback到最后一页

因此,当您按Page3中的后退按钮时,第一个处理程序应首先触发,这意味着它close app而不是going back到最后一页。

那么如何解决这个问题?

在您的每一页中:

protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            HardwareButtons.BackPressed += HardwareButtons_BackPressed;
        }
protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            HardwareButtons.BackPressed -= HardwareButtons_BackPressed;
        }

这意味着无论何时离开此页面,您都会取消注册Backpressed事件,当您进入页面时,您会注册一个新页面以使其正常工作。