2009-08-29 5 views
9

Im Rahmen einer Navigations-Stil WPF-Anwendung (Navigation, nicht XBAP):Parameter an einer WPF-Seite über seine Uri

Ist es möglich, dass ein NavigateUri des Hyperlink zusätzliche Parameter enthält, wie Pfaddaten oder einem Querystring? Wie könnte ich zum Beispiel meine NavigateUri auf /Product.xaml/123 oder /Product.xaml?id=123 setzen und meine Product.xaml-Seite sehen können, dass sie mit einem Parameter von 123 aufgerufen wurde?

Antwort

16

Sie können dies tun. Siehe http://www.paulstovell.com/wpf-navigation:

Obwohl es nicht offensichtlich ist, können Sie Pass Query-String-Daten auf einer Seite und extrahieren sie aus dem Weg. Zum Beispiel könnte Hyperlink Wert in der URI übergeben:

<TextBlock> 
    <Hyperlink NavigateUri="Page2.xaml?Message=Hello">Go to page 2</Hyperlink> 
</TextBlock> 

Wenn die Seite geladen wird, kann es die Parameter extrahieren über NavigationService.CurrentSource, die ein Uri-Objekt zurückgibt. Es kann dann den Uri untersuchen, um die Werte auseinander zu ziehen. Ich empfehle jedoch dringend gegen diesen Ansatz mit Ausnahme der schlimmsten Umstände.

Ein viel besserer Ansatz beinhaltet die Überlastung für NavigationService.Navigate verwenden, das ein Objekt für den Parameter nimmt. Sie können initialisieren das Objekt selbst, für Beispiel:

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

Dies setzt voraus, die Seite Konstruktor ein Customer-Objekt als Parameter empfängt. Dies ermöglicht es Ihnen, viel reichere Informationen zwischen Seiten, übergeben und ohne Strings zu analysieren.

+0

Wohin gehört Ihr NavigationService-Anruf? Im Click-Handler des Hyperlinks? Das scheint so zu sein, dass es im Code viel zusätzliche Verkabelung geben würde. – dthrasher

+0

Ja, in der gleichen Weise wie in ASP.NET MVC Der Code zum Rendern eines Hyperlinks wird in der Ansicht angezeigt, nicht im Modell/Controller. Die Navigation von der Ansicht zur Ansicht sollte ein Anliegen der Ansicht sein. –

+0

In gewisser Weise sieht es wie ASP.NET MVC: der "Hyperlink" wird in der Ansicht sein, aber es wird etwas aufgerufen, um die Seite zu ändern. Ich habe einen Controller dafür erstellt, mit statischen Methoden und einem statischen "MainWindow" -Objekt, das den Frame enthält, der alle meine Seiten anzeigt. Wenn ich die Seite ändern möchte, rufe ich einfach "MainController.ChangePage (page)" auf und es funktioniert. –

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

Paul Stovell Ich denke, dass Sie Ihren Vorschlag mit Ihren Seiten nicht Müll gesammelt machen, weil die ganze Instanz auf Journal bleiben.

+0

Der erste Vorschlag aktiviert die Sammlung. Der zweite Vorschlag kann trotzdem gesammelt werden, wenn Sie NavigationService.RemoveBackEntry genügend oft aufrufen, um das Journal zu löschen. WPF Frame ist aber definitiv nervig: http://www.paulstovell.com/magellan-page-management –

0

Eine andere Möglichkeit besteht darin, eine öffentliche Variable auf der Schicksalsseite zu erstellen und eine get/set -Eigenschaft zu verwenden, um ihr einen Wert zuzuweisen.

Auf Seite:

private Int32 pMyVar; 

public Int32 MyVar 
{ 
    get { return this.pMyVar; } 
    set { this.pMyVar = value; } 
} 

Bei der Navigation zu ihm:

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

this.MainFrameName.NavigationService.Navigate(NewPage); 

Wenn NewPage geladen ist, wird die ganze Zahl MyVar bis 10. MainFrameName gleich ist der Rahmen, den Sie für den Fall verwenden Sie arbeiten mit frame, aber wenn nicht, bleibt der navigationsbefehl gleich. Es ist meiner Meinung nach, aber es scheint einfacher, es so zu verfolgen, und benutzerfreundlicher für diejenigen, die aus C# vor WPF kamen.

Verwandte Themen