Windows 8 Windows应用商店应用程序,保存并加载页面间导航上Bing地图图钉的状态

Windows 8 Windows应用商店应用程序,保存并加载页面间导航上Bing地图图钉的状态,windows-8,windows-runtime,microsoft-metro,windows-store-apps,bing-maps,Windows 8,Windows Runtime,Microsoft Metro,Windows Store Apps,Bing Maps,我正在制作一个Windows应用商店应用程序,它要求用户输入,然后根据输入生成一堆图钉。当按下图钉时,应用程序将导航到包含更多细节的页面 现在我遇到的问题是: 我的页面都继承自自动生成的LayoutWarePage,因此我可以潜在地使用SaveState和LoadState来保存图钉,这样它们就不会在导航时被擦除。问题是我无法将pin保存到SaveState提供的Dictionary对象中 我得到的错误是“Value cannot be null”,它引用了LayoutAwarePage.OnN

我正在制作一个Windows应用商店应用程序,它要求用户输入,然后根据输入生成一堆图钉。当按下图钉时,应用程序将导航到包含更多细节的页面

现在我遇到的问题是: 我的页面都继承自自动生成的LayoutWarePage,因此我可以潜在地使用SaveState和LoadState来保存图钉,这样它们就不会在导航时被擦除。问题是我无法将pin保存到SaveState提供的Dictionary对象中

我得到的错误是“Value cannot be null”,它引用了LayoutAwarePage.OnNavigatedFrom()中的_pageKey变量,我不知道为什么会发生这种情况

我尝试将它们序列化为JSON字符串,以便在LoadState中反序列化,但使用字符串或UIelement列表得到相同的结果

我想这都是因为我不了解SaveState、LayoutAwarePAge和SuspensionManager是如何工作的。我想我所做的会起作用,因为字典只需要一个字符串和一个对象

我没有使用LayoutWarePage中的任何其他方法,所以如果有比使用SaveState和LoadState更好的方法,我洗耳恭听

以下是我尝试过的两个版本的SaveState:

使用JSON

    protected override void SaveState(Dictionary<String, Object> pageState)
    {
        List<string> pindata = new List<string>();
        List<string> serialisedpins = new List<string>();
        foreach (Pushpin ele in map.Children)
        {
            pindata = ele.Tag as List<string>;
            serialisedpins.Add(JsonConvert.SerializeObject(pindata));
        }

        string jasoned = JsonConvert.SerializeObject(serialisedpins);
        pageState["pins"] = jasoned;
    }
protected override void SaveState(字典页面状态)
{
List pindata=新列表();
List serialisedpins=new List();
foreach(地图中的图钉元素。子对象)
{
pindata=元件标记为列表;
Add(JsonConvert.SerializeObject(pindata));
}
字符串jasoned=JsonConvert.SerializeObject(serialisedpins);
pageState[“pins”]=jasoned;
}
使用UIElement的列表

    protected override void SaveState(Dictionary<String, Object> pageState)
    {
        List<UIElement> pins = new List<UIElement>(map.Children);
        pageState["pins"] = pins;
    }
protected override void SaveState(字典页面状态)
{
列表管脚=新列表(map.Children);
pageState[“管脚”]=管脚;
}
您得到的错误(
\u pagekey
值不能为空)与您要保存到
字典中的内容实际上并不相关。异常很可能是在
LayoutAwarePage
OnNavigateFrom()方法中引发的:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    var frameState = SuspensionManager.SessionStateForFrame(this.Frame);
    var pageState = new Dictionary<String, Object>();
    this.SaveState(pageState);
    frameState[_pageKey] = pageState; // <-- throws exception because _pageKey is null
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // Returning to a cached page through navigation shouldn't trigger state loading
    if (this._pageKey != null) return;

    var frameState = SuspensionManager.SessionStateForFrame(this.Frame);
    this._pageKey = "Page-" + this.Frame.BackStackDepth; <-- this line sets the _pageKey value

    if (e.NavigationMode == NavigationMode.New)
    {
        // Clear existing state for forward navigation when adding a new page to the
        // navigation stack
        var nextPageKey = this._pageKey;
        int nextPageIndex = this.Frame.BackStackDepth;
        while (frameState.Remove(nextPageKey))
        {
            nextPageIndex++;
            nextPageKey = "Page-" + nextPageIndex;
        }

        // Pass the navigation parameter to the new page
        this.LoadState(e.Parameter, null);
    }
    else
    {
        // Pass the navigation parameter and preserved page state to the page, using
        // the same strategy for loading suspended state and recreating pages discarded
        // from cache
        this.LoadState(e.Parameter, (Dictionary<String, Object>)frameState[this._pageKey]);
    }
}
通常原因是您在自己的页面中覆盖了
OnNavigatedTo
,而没有在其中调用
base.OnNavigatedTo(e)
。覆盖它的基本模式应该始终是:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    // the rest of your own code
}

这将确保基本实现将执行并设置
\u pageKey
值,并调用
LoadState()
加载以前保存的状态(如果有)。

谢谢,我知道是什么变量导致了错误,我只是没有意识到OnNavigatedTo已被重写。所发生的事情是,我将项目创建为空白页,然后将其更改为继承表单LayoutWarePage而不是page,因此OnNavigatedTo方法已经存在,没有更改。我也有同样的问题。但是我正在调用'base.on navigatedto(e)'@SaadAnees您的
\u pageKey
值是
null
?好的,如果您正在调用
base.OnNavigatedTo
,请尝试单步执行该方法,以确定为什么其值将保持
null
受保护的覆盖void OnNavigatedFrom(NavigationEventTargets e){var frameState=SuspensionManager.SessionStateForFrame(this.Frame);var pageState=new Dictionary();this.SaveState(pageState);frameState[_pageKey]=pageState;}
@SaadAnees这是Windows 8.1模板,代码来自
NavigationHelper.OnNavigatedFrom
?在这种情况下,
\u pageKey
NavigationHelper.OnNavigatedTo
中初始化。它可能不是从页面的
OnNavigatedTo
中调用的。顺便说一句,这个讨论越来越需要一个单独的问题。