如何在按下之前覆盖硬件按钮以获取页面名称

时间:2015-05-15 16:49:52

标签: c# xaml windows-phone-8.1

在我的page.xaml中,我将Back硬件按钮连接起来:

 Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;

并实施方法:

private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
        // Handle the Virtual Hardware Button: Back,
        // When user taps it, I need to get the previous page name. 
        System.Diagnostics.Debug.WriteLine("CurrentSourcePageType = " + Frame.CurrentSourcePageType.FullName);
        System.Diagnostics.Debug.WriteLine("Back button is pressed...");
    }

但是在这里, Frame.CurrentSourcePageType.FullName 已经是后面导航的页面名称,我怎样才能获得上一个页面名称?

也许我需要在这里更好地描述我的问题: 假设我有2页A和B, 通过页面AI导航到页面B,在页面BI中做了一些事情,然后我只想使用后退按钮来触发一些自定义操作(我不想在我的页面中添加按钮),但是这个动作需要先得到页面B的名字。

1 个答案:

答案 0 :(得分:2)

首先, HardwareButtons.BackPressed 是一个应用范围的事件,所以在 Page 中订阅它不是一个好主意,除非你非常小心地这样做并且记得在不再需要时取消订阅。值得一提的是,如果在 Page 之前已经将任何内容隐藏在此事件中,您应该特别注意 - 例如在app的构造函数或其他任何地方。 (一些典型的地方是节目here in Igrali's answer)。

要执行您想要的操作,例如,可以构建一个负责操作的应用程序范围的事件,或者使用如下所示的代码(在Rob Caplan's answer之后)。在这两种情况下,您可以从 Frame.BackStack 获取上一页的名称(类型)。

RelayCommand myGoBackCommand;

public BasicPage1()
{
    this.InitializeComponent();

    this.navigationHelper = new NavigationHelper(this);
    this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
    this.navigationHelper.SaveState += this.NavigationHelper_SaveState;
    myGoBackCommand = new RelayCommand(() => GoBackAction());
    this.navigationHelper.GoBackCommand = myGoBackCommand;
}

private void GoBackAction()
{
    //print previous page name before going back
    Debug.WriteLine(Frame.BackStack.Last().SourcePageType);
    if (navigationHelper.CanGoBack())
        navigationHelper.GoBack();
}

注意:要使上述代码生效,请删除 HardwareButtons.BackPressed 的所有其他订阅,并使您的页面 BasicPages (使用导航助手等)。当然,您可以拥有其他订阅,但是您需要仔细处理它们,在大多数情况下,这些事件会按照订阅的顺序触发。

备注 - 如果您还需要处理用户从其他页面导航回来并且您想要该页面名称的情况 - 然后在 OnNavigatedTo (前进/后退导航)中识别导航类型,然后读取合适的Frame堆栈 - BackStack ForwardStack

上面的代码是使用 BasicPage 模板 - 如果你没有提到的类,那么为你的项目添加一个新的 BasicPage ,VS应该问你是否想要添加公共文件( NavigationHelper ans等)。