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

Posted

技术标签:

【中文标题】在 Windows Phone 8 中的页面之间传递字符串【英文标题】:Passing a string between pages in Windows Phone 8 【发布时间】:2013-12-12 00:00:20 【问题描述】:

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

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

【问题讨论】:

developer.nokia.com/Community/Wiki/… @Erik 请不要忘记勾选最适合您的答案,以便未来的人们会发现这很有用。 【参考方案1】:

喂,

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

【讨论】:

【参考方案2】:

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

Messenger.Default.Send(new PageMessagemessage="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 架构中导航。

【讨论】:

【参考方案3】:

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

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 保留字符(例如,&amp;?),那么您必须对它们进行 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);

【讨论】:

然后我得到一个 ArgumentNullException 我将尝试尽快运行此代码 - 现在我的应用程序遇到了一些我必须修复的错误行为,以便在我再次测试您的代码之前它是稳定的【参考方案4】:

看看 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

【讨论】:

【参考方案5】:

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

也就是说,这也是一种非常快速和肮脏的方式。此方法也可以处理复杂的对象。

我喜欢使用PhoneApplicationService.State,它是Dictionary&lt;String,Object&gt;

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

然后在第二页你这样做

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

MSDN Documentation

【讨论】:

谢谢两位的回答,我现在无法实现它 - 我的应用程序决定表现得很奇怪,但我会尽快尝试:) 如果您希望保留数据,我认为这种方法更好。 @Romasz 是的,你说得对。这是保存数据的一种非常简单的方法。它使在 xaml 页面之间传递复杂的自定义对象变得非常简单。不必序列化它们甚至更糟,将它们分解为字符串格式并将它们传递给 url

以上是关于在 Windows Phone 8 中的页面之间传递字符串的主要内容,如果未能解决你的问题,请参考以下文章

windows phone silverlight 8 app 系统托盘颜色变化

Windows Phone 8.1 中的 BackButtonPressed 问题?

Windows Phone 8 中的 GetDistanceTo 去了哪里?

SQLite WinRT 包装器在 Windows phone 8.1 项目中的处理器架构之间提供了不匹配

Windows Phone 8.1中的ContentDialog无法正常关闭,即使它已隐藏

IBM Worklight 6.0 应用程序 - 带有 jQ​​uery Mobile 的 Windows Phone 8 中的页面呈现问题