【问题标题】:How to save a page state?如何保存页面状态?
【发布时间】:2014-11-04 10:46:08
【问题描述】:

在 Windows 运行时应用程序中,我加载如下数据:

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

然后用户可以从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"));
    }
}

因此它会向前导航到同一页面,但会显示新的关注者。

问题是当它导航回来时,它会再次加载数据并从列表的开头显示,而不是显示最后选择的项目。

那么如何在NavigationHelper_SaveState 中保存List 的数据,以及如何在列表中最后一个位置的NavigationHelper_LoadState 中再次加载它?谢谢。

【问题讨论】:

    标签: c# windows-runtime windows-phone windows-store-apps windows-phone-8.1


    【解决方案1】:

    这是一个基本的半测试示例,您可以从这里开始。您需要对其进行修改以适应您的具体情况。部分改编自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;
        }
    }
    

    【讨论】:

    • 非常感谢.. 我认为可以将我们的自定义类型添加到 SuspensionManager 以便它知道类型并且可以处理它?
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多