之前也曾提出过类似的问题,但是这个问题致力于探索更多的选择以及传递复杂对象的能力。
问题是如何传递参数,但实际上需要将其分为三部分。
Uri导航示例
page.NavigationService.Navigate(new Uri("/Views/Page.xaml", UriKind.Relative));
手动导航示例
page.NavigationService.Navigate(new Page());
该问题的答案适用于WP7,silverlight,WPF和Windows 8。
注意:Silverlight和Windows8之间有区别
1.使用查询字符串
您可以通过查询字符串传递参数,使用此方法意味着必须将数据转换为字符串并对其进行url编码。您只应使用它来传递简单数据。
导航页面:
page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative));
目标页面:
string parameter = string.Empty; if (NavigationContext.QueryString.TryGetValue("parameter", out parameter)) { this.label.Text = parameter; }
2.使用NavigationEventArgs
page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative)); // and .. protected override void OnNavigatedFrom(NavigationEventArgs e) { // NavigationEventArgs returns destination page Page destinationPage = e.Content as Page; if (destinationPage != null) { // Change property of destination page destinationPage.PublicProperty = "String or object.."; } }
// Just use the value of "PublicProperty"..
3.使用手动导航
page.NavigationService.Navigate(new Page("passing a string to the constructor"));
public Page(string value) { // Use the value in the constructor... }
我认为这里的主要区别是应用程序生命周期。出于导航原因,手动创建的页面会保留在内存中。在此处了解更多信息。
您可以使用方法一或二来传递复杂的对象(推荐)。您还可以将自定义属性添加到Application类或将数据存储在中Application.Current.Properties。
Application
Application.Current.Properties