昨天在开发windows phone 8.1程序时,发现程序在挂起的时候,会自动退出。通过调试发现错误信息是
System.Runtime.InteropServices.COMException (0x80004005): Unspecified error GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate. at Windows.UI.Xaml.Controls.Frame.GetNavigationState() at TX.WifiSurfing.Common.SuspensionManager.SaveFrameNavigationState(Frame frame) at TX.WifiSurfing.Common.SuspensionManager.<SaveAsync>d__0.MoveNext() System.Collections.ListDictionaryInternal
意思是由于页面导航的参数不支持序列化,程序挂起时保存状态的时候出现了异常:
/// <summary> /// 在将要挂起应用程序执行时调用。 将保存应用程序状态 /// 将被终止还是恢复的情况下保存应用程序状态, /// 并让内存内容保持不变。 /// </summary> private async void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); await SuspensionManager.SaveAsync(); deferral.Complete(); }
但是我整个程序并没有在导航的时候传递对象,出现这问题很让我费解。通过查看异常页面的OnNavigatedTo方法,发现当我使用NavigateToPageAction导航的时候,如果Parameter不设置,程序会设置一个默认值,由于我是使用EventTriggerBehavior的Tapped事件触发的,Parameter被设置成了TappedRoutedEventArgs,这是一个不可序列化的对象,所以在挂起时保存状态的时候出现了错误。把它设置成Parameter=“ ”是一个解决方案(注:设置成Parameter=“”和Parameter=“{x:null}”都不可以,还是原来的默认值)。
SuspensionManagerErrorDemo.rar