在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.EscapeDataString
和Uri.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注册后传递字符串。 使用字符串(比如消息)变量创建一个模型类(比如PageMessage)。 你想将字符串从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(); }