在Windows Phone 8中的页面之间传递字符串

我需要在Windows Phone 8中的两个页面之间传递一个简单的字符串。我一直在搜索,试图找到最好的方法 – 但我试过的那些结果不能正常工作 – 所以我问你:在Windows Phone 8中在两个页面之间传递简单字符串的最佳方法是什么。这是我用于导航到另一个页面的方法:

NavigationService.Navigate(new Uri("/newpage.xaml", Urikind.Relative)); 

对于字符串变量,最简单的方法是使用查询字符串参数:

 NavigationService.Navigate(new Uri("/newpage.xaml?key=value", Urikind.Relative)); 

使用NavigationContext.QueryString在目标页面上选择它:

 protected override void OnNavigatedTo(NavigationEventArgs e) { if (NavigationContext.QueryString.ContainsKey("key")) { string val = NavigationContext.QueryString["key"]; // etc ... } } 

注意:如果您的字符串仅包含字母数字字符,则上述操作无需修改即可使用。 但是,如果您的字符串可能包含URL保留字符(例如, & ? ),那么您必须对它们进行URL编码。 Uri.EscapeDataString使用辅助方法Uri.EscapeDataStringUri.UnescapeDataString

逃离:

 string encodedValue = Uri.EscapeDataString("R&R"); NavigationService.Navigate(new Uri("/newpage.xaml?key=" + encodedValue, Urikind.Relative)); 

为了unescape:

 string encodedValue = NavigationContext.QueryString["key"]; string val = Uri.UnescapeDataString(encodedValue); 

我不得不说,对于简单的数据,@ McGarnagle可能是一个更好的解决方案。

也就是说,这也是一种极其快速和肮脏的方式。 此方法也可以采用复杂对象。

我喜欢使用PhoneApplicationService.State ,这是一个Dictionary

 PhoneApplicationService.State.add("KeyName",YourObject); 

然后在第二页,你这样做

 var yourObject = PhoneApplicationService.State["KeyName"]; 

MSDN文档

如果您使用的是MVVM架构,则可以在使用Messenger注册后传递字符串。 使用字符串(比如消息)变量创建一个模型类(比如PageMes​​sage)。 你想将字符串从homepage.xaml传递到newpage.xaml,然后在homepage.xaml中发送这样的消息

 Messenger.Default.Send(new PageMessage{message="Hello World"}); 

在newpage.xaml中,你应该像这样注册信使,

 Messenger.Default.Register(this, (action) => ReceiveMessage(action)); private object ReceiveMessage(PageMessage action) { string receivedMessage=action.message; return null; } 

像这样你甚至可以在MVVM架构中传递任何导航。

HY,

另一种解决方案,并根据您的需要创建一个具有一个或多个string类型属性的静态类,它增强了您需要的方式。

看看Caliburn.micro。 设置非常简单,并允许您以强类型方式通过视图传递参数,如下所示:

 public void GotoPageTwo() { navigationService.UriFor() .WithParam(x => x.NumberOfTabs, 5) .Navigate(); } 

http://caliburnmicro.codeplex.com/wikipage?title=Working%20with%20Windows%20Phone%207%20v1.1&referringTitle=Documentation