Cómo navegar a una página de inicio de sesión en lugar de MainPage

Estoy en una posición complicada. Tengo una aplicación publicada y he estado recibiendo informes de fallos. La mayoría de los cuales es InvalidOperationException. Todos los 19 cuadros en el seguimiento de la pila muestran funciones internas y, por lo tanto, no puedo averiguar qué función lo generó. Con mucha depuración, creo que I InvalidOperation Exception se debe a la forma en que redirijo la navegación a una página de inicio de sesión.

El funcionamiento básico es así. Si el usuario ha establecido una contraseña, navega a la página de contraseña o a MainPage. El código de la siguiente manera

App()
{
   // the usual code
   RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);
}


void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
        if (e.Uri.ToString().Contains("/RootPage.xaml") != true)
            return;

        CycleManager pCycMan = CycleManager.Instance;

        e.Cancel = true;
        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (pCycMan.GetPasswordEnabled())
                RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative));
            else
                RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        });
}

La página raíz mencionada anteriormente se define en <App> etiqueta en WMAppManifest.xml

<Tasks>
  <DefaultTask Name="_default" NavigationPage="RootPage.xaml" />
</Tasks>

Cuando depuré los códigos anteriores, encontré la misma pila de llamadas que StackTrace. ¿Alguien podría decirme si este es el método correcto para navegar a una página diferente a la página principal? He incluido StackTrace a continuación

"Frame    Image             Function                                                Offset    
0        coredll.dll       xxx_RaiseException                                      19        
1        mscoree3_7.dll                                                            436488    
2        mscoree3_7.dll                                                            386545    
3        mscoree3_7.dll                                                            540936    
4                          TransitionStub                                          0         
5                          System.Windows.Navigation.NavigationService.Navigate    1580      
6                          System.Windows.Controls.Frame.Navigate                  80        
7                          .__c__DisplayClass5._Application_Activated_b__3         136       
8        mscoree3_7.dll                                                            429164    
9        mscoree3_7.dll                                                            185803    
10       mscoree3_7.dll                                                            84423    
11                         System.Reflection.RuntimeMethodInfo.InternalInvoke      112       
12                         System.Reflection.RuntimeMethodInfo.InternalInvoke      1564      
13                         System.Reflection.MethodBase.Invoke                     104       
14                         System.Delegate.DynamicInvokeOne                        564      
15                         System.MulticastDelegate.DynamicInvokeImpl              84        
16                         System.Windows.Threading.DispatcherOperation.Invoke     80        
17                         System.Windows.Threading.Dispatcher.Dispatch            404       
18                         System.Windows.Threading.Dispatcher.OnInvoke            56        
19                         System.Windows.Hosting.CallbackCookie.Invoke            84"

Gracias por la paciencia en leer una pregunta tan larga.

preguntado el 04 de julio de 12 a las 08:07

3 Respuestas

Para controlar la navegación puedes lograrlo así.

Obtenga el UriMapper de los recursos app.xaml y asígnelo al marco raíz

UriMapper mapper = Resources["mapper"] as UriMapper;
RootFrame.UriMapper = mapper;

y luego actualice el mapeador según corresponda

if (IsPasswordSaved)
                mapper.UriMappings[0].MappedUri = new Uri("/PasswordPage.xaml?method=UriMapper", UriKind.Relative);
            else
                mapper.UriMappings[0].MappedUri = new Uri("/MainPage.xaml?method=UriMapper", UriKind.Relative);

Respondido 04 Jul 12, 16:07

Gracias @pan4321. Utilicé Urimapper como se sugirió, pero una vez que ingresa a la página de inicio de sesión, no navega más a la página principal al ingresar la contraseña. Tengo el siguiente cheque en la página de contraseña if (passwordBox1.Password == pCycMan.GetPassword() NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); - Alfah

¿Puede aclarar la ambigüedad de que la página de inicio de sesión y la página de contraseña son iguales o diferentes y cómo desea navegar por las páginas? - pan4321

Entonces, si se establece una contraseña, navega a la página de contraseña. Y después de ingresar la contraseña, al hacer clic en el botón Intro, no navega a la página principal: Alfah

Ok, está bien, 3 consultas sobre esto. 1) después de ingresar la contraseña, a dónde navega si no navega a la página principal. 2) si la contraseña no está configurada, ¿dónde navega? 3) ¿En qué condición desea navegar a la página principal? pan4321

1) Después de ingresar la contraseña, no navega a MainPage. Quiero que navegue a MainPage. 2) Cuando la contraseña no está configurada, navegó a MainPage, que es el comportamiento esperado. 3) Después de ingresar la contraseña, si la contraseña es correcta, quiero navegar a MainPage. - Alfah

Peter Torr tiene un gran artículo sobre este tema aquí: http://blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx?wa=wsignin1.0

HTH Rupert.

Respondido 04 Jul 12, 08:07

Este método no funciona, sigue dando vueltas dentro del RootFrame_Navigating función - Alfah

Gracias a todos, seguí la indicación dada por @ pan4321 con una pequeña modificación.

Así lo hice finalmente.

He configurado la navegación predeterminada en WMAppManifest a una página inexistente llamada RootPage.xaml

<Tasks>
  <DefaultTask Name="_default" NavigationPage="RootPage.xaml" />
</Tasks>

App.xaml tiene lo siguiente en su <Application etiqueta

xmlns:UriMapper="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone"> 

Y en el <Application.Resources etiqueta

<UriMapper:UriMapper x:Name="mapper">
   <UriMapper:UriMapping Uri="/RootPage.xaml" />
</UriMapper:UriMapper>

Dentro del App() Yo llamo al SetupUriMapper()

void SetupUriMapper()
    {
        // Get the UriMapper from the app.xaml resources, and assign it to the root frame
        UriMapper mapper = Resources["mapper"] as UriMapper;
        RootFrame.UriMapper = mapper;

        // 
        CycleManager pCycMan = CycleManager.Instance;
        bool isPasswordSet = pCycMan.GetPasswordEnabled();

        // Update the mapper as appropriate
        if (isPasswordSet)
            mapper.UriMappings[0].MappedUri = new Uri("/PasswordPage.xaml", UriKind.Relative);
        else
            mapper.UriMappings[0].MappedUri = new Uri("/MainPage.xaml", UriKind.Relative);
    }

Ahora, en cuanto a por qué cambié la navegación predeterminada a "RootPage.xaml" que el MainPage.xaml habitual es simplemente porque después de navegar a la página de contraseña, al ingresar la contraseña y hacer clic en Aceptar, no puedo navegar a MainPage.xaml. Permanece dentro de la misma página PasswordPage.

Encontré pocas respuestas esparcidas por toda la web y así es como lo comprendí. En PasswordPage después de verificar la condición y si es verdadera, idealmente debería navegar a MainPage.xaml. Pero si configuramos nuestra página predeterminada como MainPage.xaml en el archivo WMAppManifest, no navegará porque está buscando un nuevo Uri [NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));] para navegar y nuestra navegación actual predeterminada todavía está configurada en MainPage.xaml. Dado que no hay cambios en Uri, permanece en PasswordPage. Pero si definimos nuestra página predeterminada como RootPage, al llegar a PasswordPage, nuestro Uri de navegación es MainPage mientras que nuestro Uri predeterminado es RootPage.

 if (passwordBox1.Password == pCycMan.GetPassword())
     NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 

Espero que esto sea de ayuda para alguien. Por favor, corrígeme si me he equivocado.

Respondido 06 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.