3

私はここで同じ問題を抱えています:

http://social.msdn.microsoft.com/Forums/wpapps/en-us/af8615e7-8e90-4069-aa4d-3c4a84a6a3d0/windows-phone-8-fast-app-resume-with-deeplinks?forum=wpdevelop

私は C# や WP の専門家ではないので、ご容赦ください。

  • 「/MainPage.xaml?id=XX」にリンクするセカンダリ タイルがあります。
  • アプリの高速再開を有効にしています。(アプリ マニフェストの ActivationPolicy="Resume")
  • アプリには MainPage.xaml という 1 つのページしかありません。

問題: セカンダリ タイル ("/MainPage.xaml?id=XX") を使用してアプリを再開すると、以前のインスタンス (再開されたはず) の簡単なビューが表示され、MainPage が再び初期化され、新しいインスタンスが作成されます。 . 実際には、アプリは、以前に開いていたものをのぞき見した後、最初から読み込まれています。

これは明らかに望ましくない動作です。既存のインスタンスを使用してタスクを実行したいと考えています。


試行 1 :e.Cancel = true;MainPage.xaml へのナビゲーションをキャンセルするために使用します(公式のFast App Resume サンプル
の App.xaml.cs コードを使用して、アプリの起動方法を特定します)。

...
else if (e.NavigationMode == NavigationMode.New && wasRelaunched)
{
  // This block will run if the previous navigation was a relaunch
  wasRelaunched = false;

  if (e.Uri.ToString().Contains("="))
  {
    // This block will run if the launch Uri contains "=" (ex: "id=XX") which
    // was specified when the secondary tile was created in MainPage.xaml.cs
    sessionType = SessionType.DeepLink;

    e.Cancel = true; // <======================== Here

    // The app was relaunched via a Deep Link.
    // The page stack will be cleared.
  }
}
...

問題: その際、OnNavigatedTo イベント ハンドラーが起動しないため、クエリ文字列が解析されません。

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
  String navId;
  if (e.NavigationMode != System.Windows.Navigation.NavigationMode.Back)
  {
    if (NavigationContext.QueryString.TryGetValue("id", out navId))
    {
      MessageBox.Show(navId.ToString()); // Not reached
    }
  }
  ...

試行 2 :e.Cancel = true;MainPage.xaml へのナビゲーションをキャンセルし、Uri をMainPageのメソッドに渡すために使用します。

// App.xaml.cs
...
else if (e.NavigationMode == NavigationMode.New && wasRelaunched)
{
  // This block will run if the previous navigation was a relaunch
  wasRelaunched = false;

  if (e.Uri.ToString().Contains("="))
  {
    // This block will run if the launch Uri contains "=" (ex: "id=XX") which
    // was specified when the secondary tile was created in MainPage.xaml.cs
    sessionType = SessionType.DeepLink;

    e.Cancel = true;

    MainPage.GoToDeepLink(e.Uri); // <======================== Here

    // The app was relaunched via a Deep Link.
    // The page stack will be cleared.
  }
}
...

// MainPage.xaml.cs
public static void GoToDeepLink(Uri uri) // <======================== Here
{
  // Convert the uri into a list and navigate to it.
  string path = uri.ToString();
  string id = path.Substring(path.LastIndexOf('=') + 1);

  MyList list = App.ViewModel.ListFromId(Convert.ToInt32(id));
  pivotLists.SelectedItem = list;
}

問題: pivotListsが静的ではないため、オブジェクト参照が必要であるというエラーが表示されます。これを機能させるには、MainPage (MainPage newMainPage = new MainPage();) の新しいインスタンスを作成して呼び出すnewMainPage.pivotLists.SelectedItem = list;が、既存のものの代わりに newMainPage を使用する/置き換える方法がわかりません... またはそれは私が望んでいるものです/それ以上の問題/複雑さを引き起こさないでしょう.


この問題の解決策がわからず、完全に間違った方向に進んでいる可能性があります。可能であれば、コード例を使用してすべての提案を簡単な言葉にしてください。私はまだ学んでいます。

助けてくれてありがとう。

4

1 に答える 1

0

セカンダリ タイルからアプリを再度開くと、アプリが再アクティブ化され、MainPage の新しいインスタンスが作成されるようです (以前の実行からのインスタンスがある場合でも)。私があなたを正しく理解していれば、私はそのようなことをすることができました:

app.xaml.cs:

セカンダリ タイルから移動した後に前の MainPage に戻る必要があるかどうかを示す変数を追加しました。MainPage からアクセスできるようにするため、静的にする必要があります。

public static bool returnPage = false;

RootFrame_Navigating では、この変数を true に設定しています:

// ...
else if (e.NavigationMode == NavigationMode.New && wasRelaunched)
{
   // This block will run if the previous navigation was a relaunch
   wasRelaunched = false;
   returnPage = true;
// ...

ClearBackStackAfterReset では、戻るときに古いページを削除しないようにします。

// ...
if (e.NavigationMode != NavigationMode.New || returnPage)
      return;
// ...

MainPage.cs:

新しいページの点滅を見たくないので、コンストラクターを少し変更しました。

public MainPage()
{
  if (!App.returnPage)
     InitializeComponent();
}

MainPage には、セカンダリ タイルから渡される変数もありました。必要なインスタンスは 1 つだけなので、これも静的です。

private static string navId = "";

そして、トリックの核心 - OnNavigatedTo:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  if (App.returnPage)
  {
     App.returnPage = false;
     NavigationContext.QueryString.TryGetValue("id", out navId);
     NavigationService.GoBack();
  }
  else if (e.NavigationMode != NavigationMode.Reset)
  {
     // normal navigation
  }
}

それはこのように動作します:

  • アプリを正常に起動すると、returnPage が false になり、すべて正常に動作します
  • セカンダリ タイルからアクティブ化すると、いくつかのことが起こります。

    1. まず、NavigationMode.Reset を使用して前のページに移動します - 興味がないのでオフにしました - 何も起こらないはず
    です 2. 次に、プログラムは MainPage の新しいインスタンスを作成しようとしますが、returnPage は true です。 if ステートメント、InitializeComponent は実行されません。この直後、OnNavigatedTo で、プログラムは渡されたクエリ文字列を保存し、MainPage の前のインスタンスに戻ります - 前の実行から
    3. 最後に、NavigationMode.Back を使用して右の MainPage に移動し、クエリ文字列を静的変数に保存します。

2 つのことを認識しておく必要があります。最初に、おそらく少し再構築する必要があります (wasRelaunched が必要かどうかなどはわかりません)。デバッグして、何を取り除くことができるかを確認する必要があります。2 つ目 - おそらく、Tombstone ケースでアプリをテストする必要があります。

お役に立てれば。

于 2014-02-06T21:44:34.727 に答える