我有一个带有2页calendar.xaml(起始页)和historystatistics.xaml的应用程序。当我导航到historystatistics并返回日历然后尝试通过下拉手势终止应用程序时,会引发错误。上述错误发生在App.xaml的OnSuspending中的SaveAsync函数中。
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
CycleManager cycMan = CycleManager.Instance;
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
if (cycMan.Reset != true)
{
await Appname.Common.SuspensionManager.SaveAsync(); // **ERROR**
}
deferral.Complete();
}
它说
“System.Runtime.InteropServices.COMException”类型的异常 发生在mscorlib.dll中,但未在用户代码中处理。
GetNavigationState不支持参数类型的序列化 它传递给了Frame.Navigate。
我哪里错了?我从xaml的historystatistics页面做了一个简单的导航,就像这样
<Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/>
答案 0 :(得分:0)
问题是SuspensionManager使用Frame.GetNavigationState()来获取Frame的历史记录。然后它尝试将导航历史序列化为字符串,遗憾的是它无法知道如何序列化自定义复杂类型。
来自MSDN:
注意这些方法使用的序列化格式适用于内部 仅限使用。您的应用不应与其形成任何依赖关系。 此外,此格式仅支持基本类型的序列化 比如string,char,numeric和GUID类型。
此问题的最佳解决方案是重写NavigationParameter,或者如果您不想保存应用状态,只需注释该行:
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//await SuspensionManager.SaveAsync();
deferral.Complete();
}