none
NavigationCacheMode 页面导航 在线等…… RRS feed

  • 问题

  • 我描述一下我的问题:我有三个页面,暂且说成PageA/PageB和PageC好了,PageA上有一按钮可以导航到PageB,PageB绑定数据,DataContext是一个继承自IncrementalLoadingBase的一个类,(public abstract class IncrementalLoadingBase : BaseModel, IList, ISupportIncrementalLoading, INotifyCollectionChanged)PageC是PageB对应的详情页面

    1/如果我设置NavigationCacheMode="Enabled" 当我从PageB选择一项到PapeC,在GoBack到PageB时,PageB能够保存之前的页面状态,滚动位置。但是我在从PageB GoBack到PageA后,再次Navigate到PageB时,发现PageB也不在进行初始化,没有进入构造函数,这不是我想要的,PageB所绑定的数据上下文也没用改变(即使在导航之前从新new 了数据上下文对象),

    2/如果设置NavigationCacheMode="Disable" 时,PageB每次都会进行初始化,即使是PageC GoBack来的,这也不是想要的效果,因为它没有保持页面状态。

    我想要的效果是,在由PageA导航到PageB时,PageB所绑定的对象集合清空,并且能够初始化页面(进入构造函数),自动触发IncrementalLoadingBase 中的LoadMoreItemsAsync函数,进行相应条件的请求。而PageC GoBack到PageB时我希望它能够保持原有的状态不进行初始化页面。

    如对我的描述有不清楚,敬请提出,谢谢!

    在线等……

    2012年10月30日 3:13

答案

  • Hi,

    这有一个直接修改LayoutAwarePage的解决方案,但后来发现有内存泄露问题而且解决不了。所以我的建议就是把数据手动的存在一个自定义的类中,用来存放用于更新页面的数据。

    之后在页面中重写OnNavigatedTo方法,NavigationEventArgs里面通过NavigationMode可以判断是返回的还是新的页面(比如新的就是new)。这样手动的进行加载数据。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年10月30日 8:20
    版主
  • Hi,

    抱歉回复的比较迟。

    请不要设置NavigationCacheMode=true,我前面提到的内存泄露就是设置这个并且改变了LayoutAwarePage引起的。我的做法是NavigationCacheMode=false,但是手动的自己保持一份数据,因为OnNavigatedTo方法传过来的值可以判断出是否是第一次进入这个页面,因此我们可以选择性的加载我们自己保存的数据。(比如,这个数据用来在返回或者是第一次进入页面显示不同的内容等等)。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月9日 9:23
    版主

全部回复

  • Hi,

    这有一个直接修改LayoutAwarePage的解决方案,但后来发现有内存泄露问题而且解决不了。所以我的建议就是把数据手动的存在一个自定义的类中,用来存放用于更新页面的数据。

    之后在页面中重写OnNavigatedTo方法,NavigationEventArgs里面通过NavigationMode可以判断是返回的还是新的页面(比如新的就是new)。这样手动的进行加载数据。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年10月30日 8:20
    版主
  • 为什么Windows8的导航框架设计成这样,像WindowsPhone那样就好了,这样的导航用起来相当的不爽阿!

    2012年10月30日 9:37
  • Hi,

    这有一个直接修改LayoutAwarePage的解决方案,但后来发现有内存泄露问题而且解决不了。所以我的建议就是把数据手动的存在一个自定义的类中,用来存放用于更新页面的数据。

    之后在页面中重写OnNavigatedTo方法,NavigationEventArgs里面通过NavigationMode可以判断是返回的还是新的页面(比如新的就是new)。这样手动的进行加载数据。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    HI,这个问题我也遇见,能否详细说明一下您的方案,是继续使用系统的NavigationCacheMode=TRUE,在重写 OnNavigatedTo方法,判断是否是新页面返回,做自定义的数据处理,还是其它的?
    2012年11月2日 13:00
  • Hi,

    抱歉回复的比较迟。

    请不要设置NavigationCacheMode=true,我前面提到的内存泄露就是设置这个并且改变了LayoutAwarePage引起的。我的做法是NavigationCacheMode=false,但是手动的自己保持一份数据,因为OnNavigatedTo方法传过来的值可以判断出是否是第一次进入这个页面,因此我们可以选择性的加载我们自己保存的数据。(比如,这个数据用来在返回或者是第一次进入页面显示不同的内容等等)。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月9日 9:23
    版主
  • Hi~

    你这个问题好解决啊,在OnNavigatedTo中判断一下是从哪里来的,如果不是goBack 的话就设置NavigationCacheMode="Disable",这样应该就可以。

    --顺便问一下,你从B到C之后,后退回来到B,再次点击刚刚的那个Item能导航到C么,我设置了B的NavigationCacheMode后,从C回来就不能从这个Item去到C,其他Item却可以…


    • 已编辑 rio_cn 2015年11月1日 4:29 补充
    2015年11月1日 4:28