Windows Phone 8.1 - 如何处理带有参数的硬件返回按钮GoBack返回上一页

时间:2014-08-26 10:58:40

标签: c# winrt-xaml windows-phone-8.1

我有一个Windows Phone 8.1应用程序。

在用户点击硬件后退按钮的页面上,我想要向后导航,但也想将参数发送到上一页。但是GoBack函数不带任何参数。如何传回参数以便上一页?

这就是我目前处理硬件后退按钮的方式

在我的View构造函数

HardwareButtons.BackPressed += HardwareButtons_BackPressed;

事件处理程序

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null && rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}

如果有人能指出我正确的方向,我会很高兴。 在此先感谢。

4 个答案:

答案 0 :(得分:3)

我使用单例模式解决了这个问题,我创建了一个由所有移动页面看到的控制器类,通过它我通过它们传递消息。 希望这个答案可以帮助你

答案 1 :(得分:1)

根据您的应用/项目的体系结构,有多种方法可以正确处理此问题。以下是一些可能的解决方案:

1 - App.xaml.cs上的公共(静态)属性对象这样,您可以从任何地方设置对象,并从任何地方读取它。

public sealed partial class App : Application
{
    ............

    public static SomeType SomeObjectIPreferToShareAcrossApp { get; set; }

    ............
}

然后是你的反向处理程序:

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null && rootFrame.CanGoBack)
    {
        App.SomeObjectIPreferToShareAcrossApp = this.someObjectIHaveOnlyOnThisPage;
        rootFrame.GoBack();
        e.Handled = true;
    }
}

然后当您导航到某个页面时,检查该对象是否已设置,读取并重置。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back)
    {
        if (App.SomeObjectIPreferToShareAcrossApp != null)
        {
            // yay, do something :)
            App.SomeObjectIPreferToShareAcrossApp = null;
        }
    }
}

我确信有些人会反对这种共享方式,因为它可能容易出错并且难看。

2 - 某种event aggregator实现,意味着您将某个消息或对象从发布者发布/发送给所有订阅者。

3 - 共享ViewModel实例

还有其他方法,但又一次 - 这取决于项目/应用程序的架构。

答案 2 :(得分:0)

创建一个类似于:

的类
  using System;

namespace SimpleMVVM.Model
{  
    public class Customer
    {
        public int CustomerID
        {
            get; 
            set;   
        }

        public string FullName
        {
            get;
            set;
        }

        public string Phone
        {
            get; 
            set;
        }
    }
}

然后你可以通过你的页面分配/获取这些内容,而不是在页面之间发送变量。

答案 3 :(得分:0)

您必须控制到e.Handled,如下所示:

        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame != null && rootFrame.CanGoBack && !e.Handled)
        {
            rootFrame.GoBack();
            e.Handled = true;
        }

如果您无法控制e.Handled,则HardwareButtons.BackPressed事件将继续深度回归。