none
墓碑机制中数据的恢复 RRS feed

  • 问题

  • 我的主页面上是一个列表,列表的内容是下载的一个xml解析出来的。切换到后台前,在state中保存了列表的滚动条位置。切换回程序,重新解析xml,然后设置列表滚动条的offset。解析是在构造函数中完成的,在OnNavigatedTo中设置滚动条位置。 现在有个问题,切换回程序后,在设置滚动条位置时,发现listbox的count是0,但是解析完xml后,数据源中已经有数据了啊,而且OnNavigatedTo执行完后,界面上list也已经有数据了,但是为什么在OnNavigatedTo中,listbox的count怎么是空的呢
    2011年12月20日 2:54

答案

  • 在  OnNavigatedTo 中加入 this.Loaded += MainPage_Loaded; 然后把

    DopoolState state = null;

                state = app.DopState; 

                if (state != null && state.CpXml != null)

                {

                                int count = this.CP_List.Items.Count;

                                ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(this.CP_List);

                                if (scrollViewer != null)

                                    scrollViewer.ScrollToVerticalOffset(state.Cp_ScrollOffset);   

            }

    放到 MainPage_Loaded中

     

    ok,解决问题了

    2011年12月20日 6:40

全部回复

  • 您好,请问重新解析XML的操作是在哪里执行的?


    Xuesong
    2011年12月20日 3:06
    版主
  • 构造函数中, OnNavigatedTo之前
    2011年12月20日 3:10
  • 您可以考虑在先判断解析的XML是否存在,如果不存在重新解析XML。

    另:应用程序生命周期的理解也很重要,请参考MSDN的文档,或者下面的解释。

    Windows Phone Mango开发实践——应用程序生命周期

    应用程序生命周期模型

    Windows Phone应用程序生命周期的所有元素,并重点讲述在生命周期的每一过程应采取的行动。本节提供有关操作系统和用户触发应用程序状态变化的背景,以及应用程序应执行的事件处理方法。

     

     

     

     

    图1-1 应用程序生命周期

     

    激活事件

     

    当应用程序从休眠或者逻辑删除状态返回时,将调用激活事件(Activated Event)。操作系统检查应用程序的IsApplicationInstancePreserved属性,以确定应用程序从休眠状态还是从逻辑删除状态返回。如果IsApplicationInstancePreservedtrue表示应用程序处于休眠状态,操作系统从内存中恢复应用程序的状态。如果IsApplicationInstancePreserved为false表示应用程序处于逻辑删除状态,应用程序将使用状态字典恢复逻辑删除前的状态。请注意不要在激活事件中执行资源密集型的任务,比如从独立存储空间或者网络加载资源,这些无疑都增加了应用程序重新恢复所消耗的时间;最佳的做法是在应用程序启动后在后台线程上执行这类操作。

     

     

     

    OnNavigatedTo方法

     

    当用户导航到页面时调用页面的OnNavigatedTo(NavigationEventArgs)方法,包括应用程序第一次启动,或者应用程序从休眠、逻辑删除状态被重新加载。在此方法中,应检查页面是否是新的实例,如果不是则需重新加载状态数据。如果是新的实例,则从页面的状态字典中读取数据,恢复页面的UI状态。

     


    Xuesong
    2011年12月20日 5:04
    版主
  • 解析xml是没问题的,我单步调试看过。我贴点代码上来帮我看看

    public MainPage()

            {

                InitializeComponent();

                if (app.IsLaunched)//以下为下载并解析xml

                {

                    this.m_InterFaceData.GetInterface();

                    this.m_InterFaceData.LoadingCompleteEvent += new InterfaceLoading(PopupEnd);

                }

                else // 以下只为解析xml

                {

                    this.m_InterFaceData.GetLastState();

                }

            }

     

     protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)//加载数据

            {

                DopoolState state = null;

                state = app.DopState; //记录了切换到后台前的数据,此处获得,且是没有问题的

                if (state != null && state.CpXml != null)

                {

                                int count = this.CP_List.Items.Count;//这里count就为 0 了,从而导致下面的 scrollViewer 为 null

                                ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(this.CP_List);

                                if (scrollViewer != null)

                                    scrollViewer.ScrollToVerticalOffset(state.Cp_ScrollOffset);   

            }

    2011年12月20日 5:53
  • 在  OnNavigatedTo 中加入 this.Loaded += MainPage_Loaded; 然后把

    DopoolState state = null;

                state = app.DopState; 

                if (state != null && state.CpXml != null)

                {

                                int count = this.CP_List.Items.Count;

                                ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(this.CP_List);

                                if (scrollViewer != null)

                                    scrollViewer.ScrollToVerticalOffset(state.Cp_ScrollOffset);   

            }

    放到 MainPage_Loaded中

     

    ok,解决问题了

    2011年12月20日 6:40
  • this.Loaded += MainPage_Loaded;原先是在构造函数public MainPage()之中吗?


    Xuesong
    2011年12月20日 6:43
    版主
  • 原先没有加 loaded事件,但是loaded加在构造函数中也没问题
    2011年12月20日 7:03