1

在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中再次加载数据,并且列表中的最后一个位置?谢谢。

回答

2

这是一个基本的半测试例子,你可以从这里开始。您需要修改它以适应您的具体情况。其中一些改编自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; 
    } 
} 
+0

非常感谢。我认为可以将我们的自定义类型添加到SuspensionManager,以便知道类型并可以处理它? – user3293835 2014-11-04 12:22:14