2010-09-16 16 views
15

Si hago esto dentro de un control de usuario:Silverlight: cómo navegar desde un control de usuario a una página normal?

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

que dice este error:

Se requiere una referencia de objeto para el campo no estático, método o propiedad 'System.Windows.Navigation. NavigationService.Navigate (System.Uri)'

Gracias


Bueno, he resuelto pasar la página normal, como un argumento a la Co usuario ntrol, entonces podría obtener el NavigationService.

+0

Probé la solución de Waleed. Eso resolvió el mío ... – franklins

+0

He estado buscando una solución para esto durante años. El marco de navegación es una pared de ladrillo para el desarrollo de MVVM. ¡Las únicas soluciones que he encontrado son hacks desagradables que me niego a usar! ¡No quiero que mis páginas tengan ningún conocimiento de navegación! – Jordan

Respuesta

1

NavigationService es una propiedad del objeto de página en Silverlight, por lo que está recibiendo este error. No es propiedad de un UserControl en Silverlight.

Las siguientes son algunas opciones que podrán resolver el problema que está viendo.

  1. Tratar el control de usuario como control. Dale un evento que se disparará cuando se haga clic en el botón. La página puede escuchar ese evento y manejar la navegación cuando se dispara.

  2. Puede permitir que su página acceda a su principal o pasar el NavigationService de la página al usercontrol.

  3. También puede configurarlo usando mensajes, pero eso sería más complicado. Muchos marcos de MVVM tienen funciones de mensajería. MVVM Light lo tiene.

+0

bueno, en UserControl, tengo un botón, cuando se hace clic, navego a otra página. – Alan

+0

¿Se puede usar un Botón de hipervínculo en lugar del botón normal? –

+0

Yo diría que no navegue desde el control, sino que proporcione un evento a la página y permita que la página navegue. Su control solo debe ofrecer entrada, no control de navegación. –

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

normalmente uso un manejador de sucesos. Ejemplo: en el control de usuario, definir algo como

public event EventHandler goToThatPage; 

que va a llamar en su ejemplo de control enemigo de esta manera:

goToThatPage(this, new EventArgs()); 

A continuación, en el constructor de sus MainPage.xaml.cs (si el control de usuario está contenida allí) definirá:

uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage); 

y en alguna parte de sus MainPage.xaml.cs se declara finaly la acción a realizar:

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

Gracias. Esto me ayudó con una solución ... ¡y es una forma agradable y ordenada de hacerlo! – Stonetip

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

¿Qué es PhoneApplicationFrame aquí? En mi código tengo App.xaml que llama a Main.xaml Main.xaml es UserControl y quiero usar navegar desde allí. –

+0

Ese código es para Silverlight para Windows Phone – Waleed

+3

por qué esta respuesta no está marcada como correcta. Respuesta. – URAndroid

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

Sé que esto es viejo, pero también estaba en la misma situación en una aplicación Silverlight.Quería hacer algo similar a la respuesta de Deepak, pero no pude entenderlo por un tiempo más largo por qué no funcionó en mi caso.

Resulta que necesitaba llamar a actualizar y no navegar; porque originalmente pensé que navegar volvería a cargar la página si el URI es el mismo que la página actual. Perdonar mi nivel de principiante.

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

Aquí es otra solución para Silverlight para 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)); 
Cuestiones relacionadas