2011-12-22 15 views
9

Quiero agregar una barra de aplicaciones a varias páginas de mi aplicación. Por lo tanto, estoy definiendo la barra de aplicaciones como un recurso de aplicación para que pueda ser utilizada por varias páginas. Ahora, los controladores de eventos para estos botones están en la clase App como se menciona aquí http://msdn.microsoft.com/en-us/library/hh394043%28v=VS.92%29.aspx. Pero, estos botones de la barra de aplicaciones son básicamente accesos directos a páginas importantes. Por lo tanto, al hacer clic en un botón, solo accederá a la página correspondiente. Pero, como estoy definiendo los controladores de eventos en App.xaml.cs, no me permite navegar. Entiendo la razón de esto. Pero, no sé cómo resolver el problema.Navegando desde App.xaml.cs

NavigationService.Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute)); 

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

Respuesta

24

¿Funciona si usted consigue el acceso al marco?

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute)); 

Editar: Cada aplicación tiene un solo Frame. Es este marco que expone el NavigationService. Por lo tanto, NavigationService siempre es accesible a través del marco, ya que siempre hay una instancia de este en cualquier aplicación de Windows Phone. Como normalmente no crea una nueva instancia de NavigationService, es fácil pensar que es un método estático. Sin embargo, en realidad es una clase no estática que se instancia automáticamente cuando se ejecuta su aplicación. Todo lo que está haciendo en este caso es obtener la instancia global, que está adjunta al Marco siempre presente, y usarla para navegar entre las páginas. Esto significa que su clase no tiene que instanciar, o heredar explícitamente, un NavigationService.

+0

Muchas gracias. Funcionó. ¿Podría explicar esto un poco? – Divya

+2

De nada. He editado mi publicación, espero que explique por qué funciona. – keyboardP

0

una otra manera de navegar a otra página de App.xaml.cs (utilizando la barra de aplicaciones) está utilizando el rootFrame var (en la línea de fondo):

private Frame rootFrame = null; 
protected override async void OnLaunched(LaunchActivatedEventArgs args) 
{ 
    ... 
    SettingsPane.GetForCurrentView().CommandsRequested += App_CommandRequested; 
} 

private void App_CommandRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) 
{ 
SettingsCommand cmdSnir = new SettingsCommand("cmd_snir", "Snir's Page", 
       new Windows.UI.Popups.UICommandInvokedHandler(onSettingsCommand_Clicked)); 
args.Request.ApplicationCommands.Add(cmdSnir); 
} 

void onSettingsCommand_Clicked(Windows.UI.Popups.IUICommand command) 
{ 
if (command.Id.ToString() == "cmd_snir") 
     rootFrame.Navigate(typeof(MainPage)); //, UriKind.RelativeOrAbsolute); 

} 
0

me encontré con este enfoque una mejor uno. El objeto RootFrame ya está en el archivo App.xaml.cs, solo necesita llamarlo. También poner esto en un despachador de hilos de interfaz de usuario es más seguro.

Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        // change UI here 
        RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
       }); 
+0

¿Por qué es más seguro? – GBU

Cuestiones relacionadas