如何在XAML页面之间传递值(参数)?

以前也有类似的问题,但是这个问题试图探索更多的select和传递复杂对象的能力。

问题是如何传递参数,但它确实需要分成三部分。

  1. 在XAML应用程序的页面之间导航时,如何传递参数?
  2. 使用Uri导航和手动导航有什么区别?
  3. 使用Uri导航时,如何传递对象(不只是string)?

Uri导航的例子

page.NavigationService.Navigate(new Uri("/Views/Page.xaml", UriKind.Relative)); 

手动导航示例

 page.NavigationService.Navigate(new Page()); 

这个问题的答案适用于WP7,silverlight,WPF和Windows 8。

注意:Silverlight和Windows8是有区别的

  • Windows Phone:页面被导航到使用Uri,数据作为查询string或实例传递
  • Windows 8 :通过传递types和参数作为对象来导航页面

传递参数的方法

1.使用查询string

您可以通过查询string传递参数,使用此方法意味着必须将您的数据转换为string,并对它们进行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... } 

Uri和手动导航的区别

我认为这里的主要区别是应用程序的生命周期。 为了导航的原因,手动创build的页面保存在内存中。 在这里阅读更多关于它。

传递复杂的对象

您可以使用方法一或两来传递复杂的对象(推荐)。 您还可以将自定义属性添加到Application类或将数据存储在Application.Current.Properties