【问题标题】:MvvMCross navigate back multiple viewmodels / truncate navigation stackMvvMCross 导航回多个视图模型/截断导航堆栈
【发布时间】:2013-07-02 17:30:19
【问题描述】:

我有两个关于 MvvMCross 导航的问题。

  1. 如何返回导航堆栈上的视图模型?分别:如何返回指定数量的视图模型?
  2. 如何截断导航堆栈?

    例如:A|B|C 在堆栈上,导航到 D 使堆栈看起来像:D

【问题讨论】:

    标签: ios xamarin.ios navigation xamarin mvvmcross


    【解决方案1】:

    操作后台堆栈的功能是特定于平台和应用程序的 - 例如:

    • 操纵 Android 活动回栈与操纵 iOS UINavigation 控制器非常不同
    • 这取决于您的应用是否使用选项卡、活动、片段、弹出、模式、汉堡菜单等

    因此,像这样的 UI 更改的实际实现并未在 MvvmCross 中定义。

    相反,您可以在应用程序中实现presenter

    您需要遵循的基本流程是:

    1. 弄清楚你的应用结构是什么以及你想要达到什么效果

    2. 为此效果,声明一个自定义演示提示 - 例如

        public class MyFunkyPresentationHint : MvxPresentationHint
        {
            public int DegreeOfFunkiness { get; set; } 
        }
    
    1. 您可以从任何 ViewModel 创建和发送此提示
        base.ChangePresentation(new MyFunkyPresentationHint() { DegreeOfFunkiness=27 });
    
    1. 在您的自定义演示器中,您可以执行您想要的 backstack-screen-hacking:
        public override void ChangePresentation(MvxPresentationHint hint)
        {
            if (hint is MyFunkyPresentationHint)
            {
                // your code goes here
                return;
            }
    
            base.ChangePresentation(hint);
        }
    

    有关自定义演示者的示例,请参阅:http://slodge.blogspot.com/2013/06/presenter-roundup.html

    有关 backstack 操作的一个示例,请参阅Close(this) 在一些标准演示器中是如何实现的。

    【讨论】:

      【解决方案2】:

      有一篇不错的文章提供了相关信息here。 这涵盖了基于 iOS 和 Android 片段的导航。 缺少基于活动的导航的情况。 对于这种特殊情况,android 意图可以帮助添加一些标志。

      private class CustomPresenter : MvxAndroidViewPresenter
      {
          public override void Show(MvxViewModelRequest request)
          {
              if (request.PresentationValues?["NavigationMode"] == "ClearStack")
              {
                  var intent = CreateIntentForRequest(request);
                  intent.AddFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
                  Show(intent);
                  return;
              }
      
              base.Show(request);
          }
      }
      

      请注意,ActivityFlags.ClearTask | ActivityFlags.NewTask 将使您的新活动成为堆栈中唯一的活动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-21
        • 2019-10-08
        • 2022-07-22
        • 2021-06-01
        • 2020-04-12
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        相关资源
        最近更新 更多