Windows 8 Windows应用商店应用程序,保存并加载页面间导航上Bing地图图钉的状态
我正在制作一个Windows应用商店应用程序,它要求用户输入,然后根据输入生成一堆图钉。当按下图钉时,应用程序将导航到包含更多细节的页面 现在我遇到的问题是: 我的页面都继承自自动生成的LayoutWarePage,因此我可以潜在地使用SaveState和LoadState来保存图钉,这样它们就不会在导航时被擦除。问题是我无法将pin保存到SaveState提供的Dictionary对象中 我得到的错误是“Value cannot be null”,它引用了LayoutAwarePage.OnNavigatedFrom()中的_pageKey变量,我不知道为什么会发生这种情况 我尝试将它们序列化为JSON字符串,以便在LoadState中反序列化,但使用字符串或UIelement列表得到相同的结果 我想这都是因为我不了解SaveState、LayoutAwarePAge和SuspensionManager是如何工作的。我想我所做的会起作用,因为字典只需要一个字符串和一个对象 我没有使用LayoutWarePage中的任何其他方法,所以如果有比使用SaveState和LoadState更好的方法,我洗耳恭听 以下是我尝试过的两个版本的SaveState: 使用JSONWindows 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
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
中调用的。顺便说一句,这个讨论越来越需要一个单独的问题。