【发布时间】:2014-05-27 18:28:08
【问题描述】:
我正在为 Surface 应用程序使用 WinRT 和 Prism。在暂停时出现此异常。GetNavigationState 不支持对传递给 Frame.Navigate 的参数类型进行序列化
【问题讨论】:
标签: c# windows xaml windows-runtime windows-store-apps
我正在为 Surface 应用程序使用 WinRT 和 Prism。在暂停时出现此异常。GetNavigationState 不支持对传递给 Frame.Navigate 的参数类型进行序列化
【问题讨论】:
标签: c# windows xaml windows-runtime windows-store-apps
您很可能在某处将复杂类型传递给 Navigate(),而该类型无法序列化。
由 Luis Cantero here 回答:
要使用 GetNavigationState 启用框架状态的序列化, 您必须只将基本类型传递给此方法,例如字符串、字符、 数字和 GUID 类型。如果将对象作为参数传递,则 框架导航堆栈中的条目保存对象的引用 直到框架被释放或该条目在新的 与堆栈不同的导航。一般来说,我们不鼓励 将非基本类型作为参数传递给 Navigate,因为它不能 在应用程序挂起时被序列化,并且可以消耗更多 内存,因为引用由框架的导航堆栈保存到 允许应用程序前进和后退。
另见Exception when calling SuspensionManager.SaveAsync()
和http://www.damirscorner.com/UsingSuspensionManagerForSavingApplicationState.aspx
【讨论】:
Prism talks about your scenario specifically in their wiki.
它的要点:
wiki 页面上有更多信息,请查看那里。
【讨论】:
我最近自己也遇到了这个问题。确实,简单类型工作得很好,但复杂类型却不行。 从那时起,为了解决这个问题,我总是在导航到新页面之前序列化和反序列化我的对象,并在登陆新页面时反序列化我的对象。 这是实现此目的的简单代码:
登陆页面时:
Private Sub NavigationHelper_LoadState(sender As Object, e As Common.LoadStateEventArgs)
Dim NavParameter As Object = GetPageNavigationParameterFromString(e.NavigationParameter)
If TypeOf (NavParameter) Is MyObjectToTransfer Then
_transferedObject = CType(NavParameter, MyObjectToTransfer)
End If
End Sub
导航到页面时:
Frame.Navigate(GetType(MyCurrentPage), GetPageNavigationParameterFromObject(New MyObjectToTransfer(arg1, arg2 etc...)))
使用这些功能:
Public Shared Function GetPageNavigationParameterFromObject(stateObject As Object) As String
If stateObject Is Nothing Then Return String.Empty
... your code to serialize your object as a string
End Function
Public Shared Function GetPageNavigationParameterFromString(stateString As String) As Object
If stateString Is Nothing Then Return Nothing
... your code to deserialize your string to an object
End Function
适用于任何对象类型,只要您可以序列化/反序列化它,例如使用 Json。
祝你好运!
【讨论】: