2010-09-16 4 views
15

Si je le fais dans un contrôle utilisateur:Silverlight - Comment naviguer d'un contrôle utilisateur à une page normale?

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

il dit cette erreur:

Une référence d'objet est nécessaire pour le champ non statique, méthode ou propriété « System.Windows.Navigation. NavigationService.Navigate (System.Uri) »

Merci


Eh bien, je résolus passer la normale page comme argument à l'utilisateur Co ntrol, donc je pourrais obtenir le NavigationService.

+0

J'ai essayé la solution de Waleed. Cela a résolu la mine ... – franklins

+0

J'ai cherché une solution à ceci pendant des années. Le cadre de navigation est un mur de briques pour le développement MVVM. Les seules solutions que j'ai trouvées sont des hacks dégoûtants que je refuse d'utiliser! Je ne veux pas que mes pages connaissent la navigation! – Jordan

Répondre

1

NavigationService est une propriété de l'objet page dans Silverlight, ce qui explique pourquoi vous obtenez cette erreur. Ce n'est pas une propriété d'un UserControl dans Silverlight.

Voici quelques options qui vous permettront de résoudre le problème que vous rencontrez.

  1. Traitez le contrôle usercontrol. Donnez-lui un événement qu'il déclenchera lorsque le bouton est cliqué. La page peut écouter cet événement et gérer la navigation quand elle se déclenche.

  2. Vous pouvez autoriser l'accès de votre page à son parent ou passer le NavigationService de la page à usercontrol.

  3. Vous pouvez également configurer ceci en utilisant la messagerie, mais ce serait plus compliqué. De nombreux frameworks MVVM ont des fonctionnalités de messagerie. MVVM Light l'a.

+0

bien, dans le UserControl, j'ai un bouton, quand il est cliqué, je navigue vers une autre page. – Alan

+0

Pouvez-vous utiliser un lien hypertexte à la place du bouton habituel? –

+0

Je dirais ne pas naviguer à partir du contrôle, mais plutôt donner un événement à la page et permettre à la page de naviguer. Votre contrôle devrait seulement offrir une entrée et non un contrôle de navigation. –

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

J'utilise normalement un gestionnaire d'événements. Exemple: dans votre contrôle utilisateur, définir quelque chose comme

public event EventHandler goToThatPage; 

que vous appelez dans votre exemple de l'ennemi contrôle comme celui-ci:

goToThatPage(this, new EventArgs()); 

Puis dans le constructeur de votre MainPage.xaml.cs (si le contrôle de l'utilisateur est contenue là-bas), vous définirez:

uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage); 

et quelque part dans votre MainPage.xaml.cs vous déclarez l'action à finaly faire:

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

Merci. Cela m'a aidé avec une solution ... et c'est une façon agréable et ordonnée de le faire! – Stonetip

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

Qu'est-ce que PhoneApplicationFrame ici? Dans mon code, j'ai App.xaml qui appelle Main.xaml Main.xaml est UserControl et je veux utiliser naviguer à partir de là. –

+0

Ce code est pour Silverlight pour Windows Phone – Waleed

+3

pourquoi cette réponse n'est pas marquée comme correcte Réponse. – URAndroid

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

Je sais c'est vieux, mais j'étais aussi dans la même situation sur une application Silverlight.Je voulais faire quelque chose de similaire à la réponse de Deepak, mais je ne pouvais pas comprendre pour le moment pourquoi cela ne fonctionnait pas dans mon cas.

Il s'avère que j'avais besoin d'appeler rafraîchir, et ne pas naviguer; parce que je pensais initialement que naviguer rechargerait la page si l'URI est la même que la page en cours. Pardonne mon débutant.

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

Voici une autre solution pour Silverlight pour 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)); 
Questions connexes