我需要在Windows Phone 8中的两个页面之间传递一个简单的字符串。我一直在搜索,试图找到最好的方法 - 但我尝试的那些结果不能正常工作 - 所以我问你:在Windows Phone 8中两个页面之间传递一个简单字符串的最佳方法是什么。这是我用来导航到另一个页面的方法:
NavigationService.Navigate(new Uri("/newpage.xaml", Urikind.Relative));
答案 0 :(得分:19)
对于字符串变量,最简单的方法是使用查询字符串参数:
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.UnescapeDataString
。
逃避:
string encodedValue = Uri.EscapeDataString("R&R");
NavigationService.Navigate(new Uri("/newpage.xaml?key=" + encodedValue, Urikind.Relative));
to unescape:
string encodedValue = NavigationContext.QueryString["key"];
string val = Uri.UnescapeDataString(encodedValue);
答案 1 :(得分:5)
我不得不说,对于简单的数据,@ McGarnagle可能是一个更好的解决方案。
也就是说,这也是一种极其快速和肮脏的方式。这种方法也可以采用复杂的对象。
我喜欢使用PhoneApplicationService.State
Dictionary<String,Object>
PhoneApplicationService.State.add("KeyName",YourObject);
然后在第二页中你这样做
var yourObject = PhoneApplicationService.State["KeyName"];
答案 2 :(得分:2)
如果您使用的是MVVM架构,则可以在使用Messenger注册后传递字符串。 使用字符串(比如消息)变量创建一个模型类(比如PageMessage)。 你想将字符串从homepage.xaml传递到newpage.xaml,然后在homepage.xaml中发送这样的消息
Messenger.Default.Send(new PageMessage{message="Hello World"});
在newpage.xaml中,你应该像这样注册信使,
Messenger.Default.Register<PageMessage>(this, (action) => ReceiveMessage(action));
private object ReceiveMessage(PageMessage action)
{
string receivedMessage=action.message;
return null;
}
像这样你甚至可以在MVVM架构中传递任何导航。
答案 3 :(得分:2)
HY,
另一种解决方案,根据您的需要创建一个具有一个或多个string类型属性的静态类,它可以增强您所需的方式。
答案 4 :(得分:0)
看看Caliburn.micro。设置非常简单,并允许您以强类型方式通过视图传递参数,如下所示:
public void GotoPageTwo() {
navigationService.UriFor<PivotPageViewModel>()
.WithParam(x => x.NumberOfTabs, 5)
.Navigate();
}