2010-09-16 16 views
15

Jeśli zrobić to wewnątrz kontroli użytkownika:Silverlight - Jak przejść z poziomu kontroli użytkownika do normalnej strony?

NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative)); 

mówi ten błąd:

Odwołanie do obiektu jest wymagane dla pola non-static, metody lub właściwości „System.Windows.Navigation. NavigationService.Navigate (System.Uri)”

Dziękuję


Well, I rozwiązać przechodząc normalną stronę jako argument do użytkownika Współpracy ntrol, więc mogłem uzyskać usługę NavigationService.

+0

Próbowałem rozwiązanie z Waleed. To rozwiązało moje ... – franklins

+0

Szukałem rozwiązania tego od lat. The Navigation framework to ceglany mur do rozwoju MVVM. Jedyne znalezione przeze mnie rozwiązania to obrzydliwe hacki, których odmawiam! Nie chcę, aby moje strony miały jakąkolwiek wiedzę o nawigacji! – Jordan

Odpowiedz

1

Usługa navigationService jest własnością obiektu strony w Silverlight, dlatego pojawia się ten błąd. To nie jest właściwość UserControl w Silverlight.

Poniżej znajduje się kilka opcji, które pozwolą rozwiązać problem, który widzisz.

  1. Traktuj sterowanie użytkownika jako kontrolę. Podaj wydarzenie, które zostanie uruchomione po kliknięciu przycisku. Strona może nasłuchiwać tego zdarzenia i obsługiwać nawigację po uruchomieniu.

  2. Możesz zezwolić stronie na dostęp do jej rodzica lub przekazać usługę nawigacji od strony do elementu sterowania użytkownika.

  3. Można również ustawić to za pomocą wiadomości, ale to byłoby bardziej skomplikowane. Wiele frameworków MVVM ma funkcje przesyłania wiadomości. MVVM Light ma to.

+0

cóż, w UserControl, mam przycisk, po kliknięciu, przechodzę na inną stronę. – Alan

+0

Czy możesz użyć przycisku Hyperlink zamiast zwykłego przycisku? –

+0

Powiedziałbym, że nie poruszam się od kontroli, ale raczej wydaję wydarzenie na stronie i pozwalam na nawigację strony. Twoja kontrola powinna oferować tylko wejście, a nie sterowanie nawigacją. –

-1
 if(Application.Current.RootVisual is Page) 
     { 
      ((Page) (Application.Current.RootVisual)).NavigationService.Navigate(uri); 
     } 
12

normalnie używać eventhandler. Przykład: w kontroli użytkownika, zdefiniować coś podobnego

public event EventHandler goToThatPage; 

że będzie zadzwonić w kontroli wróg przykład tak:

goToThatPage(this, new EventArgs()); 

następnie w konstruktorze swoimi MainPage.xaml.cs (jeśli kontrola użytkownika jest zawarty tam) można określić:

uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage); 

i gdzieś w MainPage.xaml.cs ty wreszcie uznanie skargi do zrobienia:

void ControlGoToThatPage(object sender, EventArgs e) 
    { 
     this.NavigationService.Navigate(new Uri("/Pages/ThatPage.xaml", UriKind.Relative)); 
    } 
+0

Dzięki. Pomogło mi to w rozwiązaniu ... i jest to ładny, schludny sposób na zrobienie tego! – Stonetip

50
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri); 
+0

Co to jest PhoneApplicationFrame tutaj? W moim kodzie mam App.xaml, który dzwoni do Main.xaml Main.xaml to UserControl i chcę korzystać z nawigacji. –

+0

Ten kod jest dla Silverlight dla Windows Phone – Waleed

+3

, dlaczego ta odpowiedź nie jest oznaczona jako poprawna Odpowiedź. – URAndroid

0
((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame")) 
    .Navigate(new Uri("Page Name", UriKind.Relative)); 
0

wiem, że to jest stary, ale byłem też w tej samej sytuacji na aplikacji Silverlight.Chciałem zrobić coś podobnego do odpowiedzi Deepaka, ale nie mogłem zrozumieć, dlaczego to nie zadziałało w moim przypadku.

Okazuje się, że muszę zadzwonić odświeżać i nie nawigować; ponieważ początkowo sądziłem, że nawigacja przeładuje stronę, jeśli identyfikator URI jest taki sam jak bieżąca strona. Wybacz mój początkujący.

(((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh(); 
2

Oto kolejny rozwiązanie dla Silverlight dla Windows Phone 8:

public Page Page { get; set; } 

this.Loaded += delegate 
{ 
    Page = (Application.Current.RootVisual as Frame).Content as Page; 
}; 

Page.NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative)); 
Powiązane problemy