简体   繁体   English

如何保存页面状态?

[英]How to save a page state?

In a Windows Runtime app, I load data like this: 在Windows Runtime应用程序中,我像这样加载数据:

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    var userId = e.NavigationParameter as string;
    List<User> followers = GetFollowers(userId);
    this.DefaultViewModel["Followers"] = followers;
}

then user can select an item from ListView : 然后用户可以从ListView选择一个项目:

private void ContentListView_ItemClick(object sender, ItemClickEventArgs e)
{
    var selectedItem = e.ClickedItem as User;

    if (!Frame.Navigate(typeof(FollowersPage), selectedItem.UserId))
    {
        throw new Exception(this.resourceLoader.GetString("NavigationFailedExceptionMessage"));
    }
}

So it navigates forward to the same page, but shows new followers. 因此它向前导航到同一页面,但显示新的关注者。

The problem is that when it navigates back, it loads data again and shows from the beginning of the list rather than showing the last item selected. 问题在于,当它向后导航时,它将再次加载数据并从列表的开头显示,而不是显示最后选择的项目。

So how to save a List of data in NavigationHelper_SaveState and how to load it again in NavigationHelper_LoadState with last position in the list? 那么,如何在NavigationHelper_SaveState保存数据List ,以及如何在NavigationHelper_LoadState再次将数据加载到列表中的最后位置呢? thanks. 谢谢。

Here's a basic semi-tested example you can start from. 这是您可以开始的基本的半测试示例。 You'll need to modify it to fit your exact circumstances. 您需要对其进行修改以适合您的实际情况。 Some of it is adapted from here . 有些是从这里改编的。

void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
{
    var isp = (ItemsStackPanel)listview.ItemsPanelRoot;
    int firstVisibleItem = isp.FirstVisibleIndex;
    e.PageState["FirstVisibleItemIndex"] = firstVisibleItem;

    // This must be serializable according to the SuspensionManager
    e.PageState["Followers"] = this.DefaultViewModel["Followers"];
}

void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    // Do we have saved state to restore?
    if (e.PageState != null)
    {
        // Restore list view items
        this.DefaultViewModel["Followers"] = (WhateverType)e.PageState["Followers"];

        // Restore scroll offset
        var index = (int)e.PageState["FirstVisibleItemIndex"];
        var container = listview.ContainerFromIndex(index);
        listview.ScrollIntoView(container);
    }
    else
    {
        // Load data for the first time
        var userId = e.NavigationParameter as string;
        List<User> followers = GetFollowers(userId);
        this.DefaultViewModel["Followers"] = followers;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM