2009-08-29 12 views
9

W kontekście aplikacji nawigacji w stylu WPF (NavigationWindow, nie XBAP):parametry przejścia do WPF stronę przez jej Uri

Czy jest możliwe hiperłącze za NavigateUri zawierać dodatkowe parametry, takie jak dane ścieżek lub querystring? Np. Czy jest jakiś sposób ustawienia NavigateUri na /Product.xaml/123 lub /Product.xaml?id=123 i czy moja strona Product.xaml będzie w stanie zobaczyć, że została wywołana z parametrem 123?

Odpowiedz

16

Możesz to zrobić. Zobacz http://www.paulstovell.com/wpf-navigation:

Chociaż nie jest to oczywiste, można ciąg danych zapytań przechodzi na stronę i wyodrębnić go z drogi. Na przykład, hiperłącza mógł przekazać wartość w URI:

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

Po załadowaniu strony, może wyodrębnić parametry poprzez NavigationService.CurrentSource, który Zwraca obiekt Uri. Następnie może zbadać Uri, aby oddzielić wartości . Jednak zdecydowanie zalecam w odniesieniu do tego podejścia, z wyjątkiem najniebezpieczniejszych okoliczności z .

Znacznie lepsze podejście polega na użyciu przeciążenia dla usługi NavigationService.Navigate, która zajmuje obiekt dla parametru. Można zainicjować obiektu siebie, dla przykład:

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

Zakłada konstruktor strona odbiera obiekt klienta jako parametr . Dzięki temu możesz przekazać znacznie bogatsze informacje między stronami, i bez konieczności analizowania ciągów.

+0

Do czego służy wywołanie NavigationService? W module obsługi kliknięcia hiperłącza? Wygląda na to, że doprowadziłoby to do wielu dodatkowych kabli w kodzie. – dthrasher

+0

Tak, tak samo jak w ASP.NET MVC kod do renderowania hiperłącza idzie w widoku, a nie model/kontroler. Nawigacja z widoku do obejrzenia powinna budzić obawy. –

+0

W pewnym sensie wygląda to na ASP.NET MVC: "hiperlink" będzie w widoku, ale wywoła coś, co spowoduje zmianę strony. Stworzyłem do tego kontroler za pomocą metod statycznych i statycznego obiektu "MainWindow", który zawiera ramkę wyświetlającą wszystkie moje strony. Jeśli chcę zmienić stronę, po prostu zadzwonię do "MainController.ChangePage (strona)" i to działa. –

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

Paul Stovell myślę, że za pomocą sugestii sprawi, że strony nie śmieci zbierane ponieważ cała instancja pozostanie na Urzędowego.

+0

Pierwsza sugestia umożliwi zbieranie. Druga sugestia może być nadal zbierana, jeśli wywołasz usługę NavigationService.RemoveBackEntry wystarczająco dużo razy, aby wyczyścić dziennik. Ramka WPF zdecydowanie na tym polega: http://www.paulstovell.com/magellan-page-management –

0

Innym sposobem jest utworzenie publicznej zmiennej na stronie przeznaczenia i użycie właściwości get/set w celu przypisania jej wartości.

na stronie:

private Int32 pMyVar; 

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

podczas nawigacji do niego:

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

this.MainFrameName.NavigationService.Navigate(NewPage); 

Kiedy NewPage załadowaniu MyVar całkowita będzie równy 10. MainFrameName jest rama używasz w przypadku pracujesz z ramką, ale jeśli nie, polecenie nawigacji pozostaje takie samo, niezależnie. Jest to moja opinia, ale wydaje się łatwiejsze do śledzenia w ten sposób i bardziej przyjazny dla użytkowników, którzy pochodzili z C# przed WPF.

Powiązane problemy