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