Wie übergebe ich Werte (Parameter) zwischen XAML-Seiten?

Ähnliche Fragen wurden schon einmal gestellt, aber diese Frage zielt darauf ab, mehr Optionen und die Fähigkeit zu untersuchen, komplexe Objekte zu übergeben.

Die Frage ist, wie Parameter übergeben werden, aber es muss wirklich in drei Teile aufgeteilt werden.

  1. Wenn Sie zwischen Seiten in einer XAML-Anwendung navigieren, wie übergeben Sie Parameter?
  2. Was ist der Unterschied zwischen der Uri-Navigation und der manuellen Navigation?
  3. Wie können Objekte (nicht nur Strings) bei der Uri-Navigation übergeben werden?

Beispiel für Uri Navigation

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

Beispiel für die manuelle Navigation

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

Die Antwort auf diese Frage gilt für WP7, Silverlight, WPF und Windows 8.

Hinweis: Es gibt einen Unterschied zwischen Silverlight und Windows8

  • Windows Phone: Seiten werden zur Verwendung eines Uri navigiert und Daten als Abfragezeichenfolge oder Instanz übergeben
  • Windows 8 : Seiten werden durch Übergeben des Typs und Parameter als Objekte navigiert

Methoden zum Übergeben von Parametern

1. Verwenden der Abfragezeichenfolge

Sie können Parameter über die Abfrage-Zeichenfolge übergeben, mit dieser Methode müssen Sie Ihre Daten in Zeichenfolgen und URL konvertieren sie kodieren. Sie sollten dies nur verwenden, um einfache Daten zu übergeben.

Navigationsseite:

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

Zielseite:

 string parameter = string.Empty; if (NavigationContext.QueryString.TryGetValue("parameter", out parameter)) { this.label.Text = parameter; } 

2. Verwenden von NavigationEventArgs

Navigationsseite:

 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.."; } } 

Zielseite:

 // Just use the value of "PublicProperty".. 

3. Verwenden der manuellen Navigation

Navigationsseite:

 page.NavigationService.Navigate(new Page("passing a string to the constructor")); 

Zielseite:

 public Page(string value) { // Use the value in the constructor... } 

Unterschied zwischen Uri und manueller Navigation

Ich denke, der Hauptunterschied ist der Anwendungslebenszyklus. Manuell erstellte Seiten werden aus Navigationsgründen im Speicher gehalten. Lesen Sie hier mehr darüber.

Übergeben komplexer Objekte

Sie können Methode eins oder zwei verwenden, um komplexe Objekte zu übergeben (empfohlen). Sie können der Application class auch benutzerdefinierte Eigenschaften hinzufügen oder Daten in Application.Current.Properties speichern.