uwp template 10 学习(二)

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的说明文档

猜你喜欢

转载自blog.csdn.net/ousuixin/article/details/79781665
UWP