在Windows Phone 8中传递字符串到另一页

8
我需要在Windows Phone 8两个页面之间传��一个简单的字符串。我一直在搜寻,试图找到最好的方法 - 但我尝试过的那些方法都不像它们应该工作 - 所以我问你:在Windows Phone 8中传递简单字符串的最佳方法是什么?这是我用来导航到其他页面的方法:
NavigationService.Navigate(new Uri("/newpage.xaml", Urikind.Relative));

1
http://developer.nokia.com/Community/Wiki/Passing_parameters_while_navigating_between_pages_on_Windows_Phone - YK1
@Erik请不要忘记勾选最佳答案,这样未来的人们才能从中受益。 - DotNetRussell
5个回答

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));

取消转义:

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

1
我接着收到一个ArgumentNullException。 - Erik
我会尽快运行这段代码 - 现在我的应用程序遇到了一些问题,我必须先修复它以使其稳定,然后再次测试您的代码。 - Erik

5

我必须说,对于简单的数据,@McGarnagle可能是更好的解决方案。

话虽如此,这也是一种极快且肮脏的方法。该方法还可以处理复杂对象。

我喜欢使用PhoneApplicationService.State,它是一个Dictionary<String,Object>

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

然后在第二页,您需要执行以下操作:
var yourObject = PhoneApplicationService.State["KeyName"];

MSDN Documentation


谢谢你们两个的回答,我现在无法实现它 - 我的应用程序决定表现出奇怪的行为,但我会尽快尝试 :) - Erik
我认为如果您想保留数据,这种方法更好。 - Romasz
@Romasz 是的,你说得对。这是一种非常简单的保留数据的方法。它使得在 XAML 页面之间传递复杂的自定义对象变得非常简单。不必将它们序列化或更糟糕的是将它们分解成字符串格式并通过 URL 传递。 - DotNetRussell

2

如果你正在使用MVVM架构,则可以在注册后使用Messenger传递字符串。 创建一个模型类(比如PageMessage),其中包含一个字符串变量(比如message)。 如果你想要从homepage.xaml传递字符串到newpage.xaml,在homepage.xaml中只需像这样发送消息:

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

在newpage.xaml中,您需要像这样注册messenger:
Messenger.Default.Register<PageMessage>(this, (action) => ReceiveMessage(action));

 private object ReceiveMessage(PageMessage action)
 {
    string receivedMessage=action.message;
    return null;
 }

就像这样,你甚至可以在MVVM架构中传递任何东西,包括导航。


2

你好,

另一种解决方案是创建一个静态类,其中包含一个或多个字符串类型的属性,具体取决于你需要什么,这样可以增强在需要时可用的方式。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接