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>タグで定義されています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

みなさん、ありがとうございました。@pan4321からのキューに少し変更を加えました。

これが私がついにやった方法です。

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

デフォルトのナビゲーションを通常のMainPage.xamlよりも「RootPage.xaml」に変更した理由は、パスワードページに移動した後、パスワードを入力して[OK]をクリックすると、MainPage.xamlに移動できないためです。同じページPasswordPage内にとどまります。

私はウェブ全体に散らばっている答えをほとんど見つけませんでした、そしてこれは私が理解した方法です。条件を確認した後のPasswordPageで、それがtrueの場合は、理想的には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 に答える
0

Peter Torr は、この件に関する優れた記事をここに掲載しています

HTH ルパート。

于 2012-07-04T07:50:05.493 に答える