Passing complex parameters when use navigate
使用导航时在页面间传递参数的办法一般是:
- 如果时简单的参数那么直接传递就可以
- 复杂一点的话将参数序列化然后传递
- 但是这样就会出现注入参数太大序列化时间过长、还有些参数无法序列化这样的问题
template10模板为我们提供了传递导航时复杂参数的一些新办法:sessionstate
下面介绍一下sessionstate的使用:
这是在detailviewmodel里面的一段代码public override IStateItems SessionState { get; set; } public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState) { string TheMessagePassed = parameter as string; SessionState.Add("Gas", "test"); if (SessionState.ContainsKey(TheMessagePassed)) { string ValueOfTheMessage = SessionState[TheMessagePassed] as string; Value = ValueOfTheMessage; } //Value = (suspensionState.ContainsKey(nameof(Value))) ? suspensionState[nameof(Value)]?.ToString() : parameter?.ToString(); await Task.CompletedTask; }
首先我们必须重写一下SessionState这个从ViewModelBase继承下来的虚拟成员,由于ViewModelBase是个抽象类,所以想要使用它的所有方法/成员都必须重写一遍,哪怕重写的内容和之前的内容一样(否则就会出现错误)。
然后我们就可以使用SessionState了,它的类型是IstateItem,可以去看看这个接口下有哪些方法然后使用,这里使用了add方法添加一个键值对。
Suspension management
暂停时的缓存
- 在离开页面的时候调用OnNavigatedFromAsync保存这个页面的信息,其中的suspensionState就是在挂起的时候保存当前页面状态的变量
在导航到这个页面的时候调用OnNavigatedToAsync来读入之前保存的信息,按照键值对读取suspensionState中的信息
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState) { if (suspensionState.Any()) { Value = suspensionState[nameof(Value)]?.ToString(); } await Task.CompletedTask; } public override async Task OnNavigatedFromAsync(IDictionary<string, object> suspensionState, bool suspending) { if (suspending) { suspensionState[nameof(Value)] = Value; } await Task.CompletedTask; }
这里nameof(value)就是“value”,也就是说存档的键值对就是变量名字和这个变量
关于template10的返回按钮
这个返回按钮时这个模板自己定义的东西ShowShellBackButton,如果ShowShellBackButton的值是0,那么返回按钮就会显示在pageheader左侧,如果是1就会显示在uwp应用的顶部(相当于appbarbackbutton的效果);
<controls:PageHeader x:Name="pageHeader" Content="Settings Page" Frame="{x:Bind Frame}" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignTopWithPanel="True" />
只要某个页面是由导航过来的(第一次加载mainpage除外,后续如果由其它页面导航到mainpage则可以显示//注意不是goback,是navigate),那么就可以显示返回按钮。
至于具体实现方法,可以参考template10的说明文档