web-dev-qa-db-fra.com

Comment passer des valeurs (paramètres) entre des pages XAML?

Des questions similaires ont été posées auparavant, mais cette question vise à explorer plus d'options et la capacité de passer des objets complexes.

La question est de savoir comment passer les paramètres mais cela doit vraiment être divisé en trois parties.

  1. Lorsque vous naviguez entre les pages d'une application XAML, comment passez-vous les paramètres?
  2. Quelle est la différence entre l'utilisation de la navigation Uri et la navigation manuelle?
  3. Comment passer des objets (pas seulement des chaînes) lors de l'utilisation de la navigation Uri?

Exemple de navigation Uri

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

Exemple de navigation manuelle

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

La réponse à cette question s'applique à WP7, silverlight, WPF et Windows 8.

Remarque: il existe une différence entre Silverlight et Windows8

  • Windows Phone: les pages sont parcourues pour utiliser un Uri et les données transmises comme une chaîne de requête ou une instance
  • Windows 8 : les pages sont parcourues en passant le type et les paramètres en tant qu'objets
37
Daniel Little

Méthodes pour passer des paramètres

1. Utilisation de la chaîne de requête

Vous pouvez passer des paramètres à travers la chaîne de requête, en utilisant cette méthode, vous devez convertir vos données en chaînes et les coder par URL. Vous ne devez l'utiliser que pour transmettre des données simples.

Page de navigation:

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

Page de destination:

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

2. Utilisation de NavigationEventArgs

Page de navigation:

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

Page de destination:

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

3. Utilisation de la navigation manuelle

Page de navigation:

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

Page de destination:

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

Différence entre Uri et navigation manuelle

Je pense que la principale différence ici est le cycle de vie de l'application. Les pages créées manuellement sont conservées en mémoire pour des raisons de navigation. En savoir plus ici .

Passer des objets complexes

Vous pouvez utiliser la méthode un ou deux pour passer des objets complexes (recommandé). Vous pouvez également ajouter des propriétés personnalisées à la classe Application ou stocker des données dans Application.Current.Properties.

86
Daniel Little