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

时间:2013-11-26 17:26:53

标签: c# windows-phone-8 windows-phone parameter-passing

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

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

5 个答案:

答案 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.EscapeDataStringUri.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"];

MSDN Documentation

答案 2 :(得分:2)

如果您使用的是MVVM架构,则可以在使用Messenger注册后传递字符串。 使用字符串(比如消息)变量创建一个模型类(比如PageMes​​sage)。 你想将字符串从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();  
}

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