11
votes

Passer des paramètres à une page WPF via son URI

Dans le contexte d'une application WPF de style de navigation (NavigationWindow, pas Xbap):

est-il possible pour un NavigateDuri d'un hyperlien contenant des paramètres supplémentaires, comme des données de chemin ou une querystring? Par exemple, y a-t-il une manière que je puisse définir mon navigateur sur /product.xaml/123 ou /product.xaml?id=123 , et avoir mon produit.xaml la page soit capable de voir qu'il a été appelé avec un paramètre de 123 ?


0 commentaires

3 Réponses :


18
votes

Vous pouvez le faire. Voir http://www.paulstovell.com/wpf-navigation :

Bien que ce ne soit pas évident, vous pouvez passer des données de chaîne de requête sur une page, et extrayez-le du chemin. Par exemple, Votre hyperlien pourrait passer une valeur dans l'URI: p>

Customer selectedCustomer = (Customer)listBox.SelectedItem;
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer));


4 commentaires

Où appartiennent votre appel de votre navigationservice? Dans le gestionnaire de clic de l'hyperlien? Cela semble que cela conduirait à beaucoup de câblage supplémentaire dans le code derrière.


Oui, de la même manière que dans ASP.NET MVC, le code pour rendre un hyperlien passe en vue, pas le modèle / contrôleur. La navigation de la vue pour voir devrait être une préoccupation de vue.


D'une certaine manière, il ressemble à ASP.NET MVC: le "lien hypertexte" sera à la vue, mais cela appellera quelque chose pour effectuer le changement de page. J'ai créé un contrôleur pour le faire, avec des méthodes statiques et un objet "MainWindow" statique, qui contient le cadre qui affiche toutes mes pages. Si je veux changer la page, j'appelle simplement 'MainController.Changepage (page) "et ça marche.


Notez que la documentation officielle de MSDN suggère de passer des paramètres de l'URL: msdn.microsoft.com/en-us/library/ff626521 (v = vs.92) .aspx ; En outre, la méthode Naviagte ne semble pas prendre une page comme argument, mais seulement un objet URI



0
votes
Customer selectedCustomer = (Customer)listBox.SelectedItem; 
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer)); 
Paul Stovell I think that using your suggestion will make your pages not garbage collected
because the whole instance will remain on Journal.

1 commentaires

La première suggestion permettra la collecte. La deuxième suggestion peut toujours être collectée si vous appelez des moments de navigagerservice.removebackentry suffisamment pour "effacer" le journal. Le cadre WPF est définitivement nul pour cela: paulstovell.com/magellan-page-management



0
votes

Une autre solution consiste à créer une variable publique sur la page Destiny et à utiliser une propriété get / Set pour assigner une valeur à celle-ci.

à la page: P>

MyPagePath.PageName NewPage = new MyPagePath.PageName();
NewPage.MyVar = 10;

this.MainFrameName.NavigationService.Navigate(NewPage);


0 commentaires