0

我处于一个棘手的位置。我有一个已发布的应用程序并且一直在接收崩溃报告。其中大部分是InvalidOperationException. 堆栈跟踪中的所有 19 帧都显示了内部函数,因此我无法弄清楚是哪个函数引发了它。经过大量调试,我认为我的 InvalidOperation Exception 是由我将导航重定向到登录页面的方式引起的。

基本操作是这样的。如果用户设置了密码,它将导航到密码页面,否则导航到 MainPage。代码如下

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));
        });
}

上面提到的RootPage是在<App>tag中定义的WMAppManifest.xml

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

在调试上述代码时,我发现与 StackTrace 相同的调用堆栈。有人可以告诉我这是否是导航到其他主页的正确方法吗?我在下面包含了 StackTrace

"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"

感谢您耐心阅读这么长的问题。

4

3 回答 3

1

要控制导航,您可以像这样实现它。

从 app.xaml 资源中获取 UriMapper,并将其分配给根框架

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

然后根据需要更新映射器

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);
于 2012-07-04T15:29:19.797 回答
0

彼得托尔在这里有一篇关于这件事的好文章 - http://blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx?wa=wsignin1.0

HTH 鲁珀特。

于 2012-07-04T07:50:05.493 回答
0

谢谢大家,我按照@pan4321 给出的提示稍作修改。

这就是我最终做到的方式。

我已将默认导航设置为WMAppManifest名为 RootPage.xaml 的不存在页面

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

App.xaml 在其<Application标记中包含以下内容

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

并且在<Application.Resources标签中

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

在里面App()我叫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);
    }

现在,为什么我将默认导航更改为“RootPage.xaml”而不是通常的 MainPage.xaml 仅仅是因为在导航到密码页面后,在输入密码并单击确定时,我无法导航到 MainPage.xaml。它位于同一页面 PasswordPage 内部。

我发现几乎没有答案散布在整个网络上,这就是我理解的方式。检查条件后在 PasswordPage 上,如果条件为真,则最好导航到 MainPage.xaml。但是,如果我们在 WMAppManifest 文件中将默认页面设置为 MainPage.xaml,它将无法导航,因为它正在寻找新的 Uri [ NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));] 进行导航,并且我们的默认当前导航仍设置为 MainPage.xaml。由于 Uri 没有变化,所以它停留在 PasswordPage。但是如果我们将默认页面定义为 RootPage,则在到达 PasswordPage 时,我们的导航 Uri 是 MainPage,而我们的默认 Uri 是 RootPage。

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

希望这对某人有帮助。如果我弄错了,请纠正我。

于 2012-07-06T14:18:11.620 回答