2014-05-13 21 views
5

(Windows Phone 8.1)在我的應用程序中,我有一個帶有列表框的MainPage。 NavigationCacheMode被設置爲在導航回到同一頁面時保留狀態。當從上一個位置恢復滾動時,Listbox跳轉到頂部

public MainPage() 
{ 
    this.InitializeComponent(); 
    this.DataContext = this; 

    // cache page 
    this.NavigationCacheMode = NavigationCacheMode.Required; 
} 

所以,當我去到另一個網頁,然後回來我的寄託都的MainPage看起來我離開它一樣。列表框也處於正確的位置。但每當我觸摸它,它會跳轉到頂部之前它滾動...

我該如何使它恢復滾動,然後再跳到頂部?

編輯:解決

好像列表框竊聽在WP8.1,使用ListView控件,而不是!

回答

5

我有同樣的問題,並發現它主要是選擇導致Bug的ItemsPanelTemplate。

當使用ListView時,標準ItemsPanelTemplate是ItemsStackPanel,它工作正常。如果將其更改爲VirtualizingStackPanel(ListBox的標準),則會出現該錯誤。但只有在Windows Phone上,對於Windows而言,它可以像預期的那樣工作。

所以我假設,當你喜歡使用ListBox而不是ListView時,你必須使用ItemStackPanel作爲ItemsPanelTemplate來通過NavigationCacheMode保存滾動位置。

+0

我也收到這個錯誤。有沒有辦法使用虛擬化面板,但手動恢復滾動位置? –

+0

是的,這是可能的,但不幸的是這是相當費力的。首先你必須掃描VisualTree才能找到ScrollViewer(http://msdn.microsoft.com/en-us/library/bb613579(v=vs.110).aspx的結尾),它只在列表渲染完成後才起作用。獲得ScrollViewer後,您可以提取水平/垂直偏移並保存。當返回到該頁面時,必須再次掃描VisualTree,獲得ScrollViewer並且呈現列表內容後,您可以滾動到保存的位置(ScrollViewer.ChangeView)。我發現目前還沒有好的方法來等待渲染:/ – eberthold

+0

只要將NavigationCacheMode設置爲Disabled,此解決方案就可以工作。當然,現在它已被禁用,您必須手動跟蹤任何要保留的UI屬性。我還沒有想出一種在緩存中使用這種技術的方法,因爲ListView不是在加載時跳轉,而是當你再次觸摸它來滾動時。 –

相關問題