我确信有几种方法可以做到这一点,但这是在不使用任何外部库的情况下完成它的最简单方法。
创建一个实用程序类 - NavigationUtility
(或其他) - 并实现以下结构:
public static class NavigationUtility
{
// The object to send
private static object passedObject = null;
// A method to fetch the object
public static object GetObject() {
// implementation below
}
// Utility method to check if an object was passed
public static bool HasObject()
{
return passedObject != null;
}
// A method to navigate to a page
public static void Navigate(string url, object obj = null)
{
// implementation below
}
}
这是您将要实现的接口。它有一个私有变量,可以在视图之间转换时保证您的对象安全,以及用于导航和获取发送的信息的方法。
现在,您需要考虑一些事情才能以正确的方式实现这一点。
- 您必须只能获取传递的对象一次 - 否则粗心的使用可能会使错误的对象出现在程序的错误部分。
- 为了使用它而不是在
NavigationService.Navigate(Uri)
整个应用程序中导航的方法,它还必须能够处理不需要发送对象的情况。
那么让我们看看我们接口中的第一个方法GetObject
——以及它是如何实现的:
public static object GetPassedObject()
{
var obj = passedObject;
passedObject = null;
return obj;
}
如您所见,我们通过在每次获取属性时将内部传递对象清空来轻松满足需求#1。这将通过以下方式工作(在接收视图中):
NavigationUtility.HasObject(); // returns true if an object was sent
var data = NavigationUtility.GetObject() as SomeModel; // fetches the object and casts it
NavigationUtility.HasObject(); // returns false always;
现在有趣的一点 - 实现Navigate
- 方法:
public static void Navigate(string url, object obj = null)
{
// Saves the object
passedObject = obj;
if( url != null && url.length > 0 )
{
// Creates the Uri-object
Uri uri = new Uri(url, UriKind.Relative);
// Navigates the user (notice the funky syntax - so that this can be used from any project
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);
}
}
就是这样!