0

私はWindows8Metro Newsreader-App(C#とXAMLを使用)に取り組んでいます。Grouped Items Page(テンプレート)にフィードアイテムを表示します。クリックすると、ユーザーは詳細ページに移動します。これは、として実装しましたSplit Page。したがって、ユーザーがこのDetailPageから(および戻る)ナビゲートできるImage-Galleryがあります。これは正常に機能します。ItemDetailPageで、LoadState関数にデータを割り当てる必要があります。テンプレートは私に次の解決策を提供します:

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    // TODO: Assign a bindable group to this.DefaultViewModel["Group"]
    // TODO: Assign a collection of bindable items to this.DefaultViewModel["Items"]

    if (pageState == null)
    {
        // When this is a new page, select the first item automatically unless logical page
        // navigation is being used (see the logical page navigation #region below.)
        if (!this.UsingLogicalPageNavigation() && this.itemsViewSource.View != null)
        {
            this.itemsViewSource.View.MoveCurrentToFirst();
        }
    }
    else
    {
        // Restore the previously saved state associated with this page
        if (pageState.ContainsKey("SelectedItem") && this.itemsViewSource.View != null)
        {
            // TODO: Invoke this.itemsViewSource.View.MoveCurrentTo() with the selected
            //       item as specified by the value of pageState["SelectedItem"]
        }
    }
}

私がしたことは次のとおりです。

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    if (pageState == null)
    {
        // When this is a new page, select the first item automatically unless logical page
        // navigation is being used (see the logical page navigation #region below.)
        if (!this.UsingLogicalPageNavigation() && this.itemsViewSource.View != null)
        {
            this.itemsViewSource.View.MoveCurrentToFirst();
        }
    }
    else
    {
        // Restore the previously saved state associated with this page
        if (pageState.ContainsKey("SelectedItem") && this.itemsViewSource.View != null)
        {
        this.itemsViewSource.View.MoveCurrentTo(pageState["SelectedItem"]);
        }
    }

    var item = ArticleDataSource.GetItem((int)navigationParameter);

    if (item != null)
    {
        this.DefaultViewModel["Group"] = item.Group;
        this.DefaultViewModel["Items"] = item.Group.Items;
        if (this.itemsViewSource.View != null) this.itemsViewSource.View.MoveCurrentTo(item); // remove?

        // Register this page as a share source.
        this.dataTransferManager = DataTransferManager.GetForCurrentView();
        this.dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested);
    }
}
  1. OverviewPageからDetailsPageに移動すると、選択したアイテム(A)が表示されます。
  2. (リストから)他のアイテムを選択すると、正しい詳細(B)が表示されます。
  3. DetailsPageからGalleryPageに移動すると、正しいアイテム(B)の画像が表示されます。
  4. ここで(DetailsPageに)戻ると、最後に選択したアイテム(B)ではなく、DetailsPageに入るために選択したアイテム(A)が表示されます。

(テンプレートによって提案された)順序を変更したという事実を認識しており、if (this.itemsViewSource.View != null) this.itemsViewSource.View.MoveCurrentTo(item);おそらく削除したほうがよいと付け加えました。

this.itemsViewSource.View問題(ステップ4で説明)は、 nullであるため、(論理的に)this.itemsViewSource.View.MoveCurrentTo(pageState["SelectedItem"])実行されないと思います。残念ながら、なぜこれがバグなのか、それがバグなのかを知ることができませんでした。

ヘルプやチュートリアルへのリンク(私の問題を解決できる可能性があります)は本当にありがたいです!ありがとう。

4

1 に答える 1

2

重要なのは、前のページの状態で必要に応じて、navigationParameterをオーバーライドすることです。次にitem、がロードされて選択されます。使ってみてください

// Override the navigationParameter if a page state is set:
if (pageState != null && pageState.ContainsKey("SelectedItem"))
{
    navigationParameter = pageState["SelectedItem"];
}

var item = ArticleDataSource.GetItem((int)navigationParameter);

if (item != null)
{
    DefaultViewModel["Group"] = item.Group;
    DefaultViewModel["Items"] = item.Group.Items;

    if (itemsViewSource.View != null)
    {
        itemsViewSource.View.MoveCurrentTo(item);
    }
    else
    {
        // A serious error happened here..
    }
}
else
{
    // Oooops, an item disappeared..
}
于 2012-07-03T11:59:29.283 に答える