我有一个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;
}
}
如果有人能指出我正确的方向,我会很高兴。 在此先感谢。
答案 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
事件将继续深度回归。