MvvMCross导航回多个viewmodels / truncate导航堆栈

时间:2013-07-04 16:29:30

标签: ios xamarin.ios navigation xamarin mvvmcross

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

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

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

2 个答案:

答案 0 :(得分:8)

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

  • 操纵Android活动后台堆栈与iOS UINavigation控制器
  • 完全不同
  • 取决于您的应用是否使用标签,活动,片段,弹出窗口,模态,汉堡菜单等。

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

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

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

  1. 确定您的应用结构是什么以及您希望实现的效果

  2. 对于此效果,请声明自定义演示提示 - 例如

  3.     public class MyFunkyPresentationHint : MvxPresentationHint
        {
            public int DegreeOfFunkiness { get; set; } 
        }
    
    1. 您可以从任何ViewModel
    2. 创建和发送此提示
          base.ChangePresentation(new MyFunkyPresentationHint() { DegreeOfFunkiness=27 });
      
      1. 在您的自定义演示者中,您可以执行您想要的后台屏幕黑客攻击:
      2.     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)的实现方式。

答案 1 :(得分:4)

有一篇很好的文章提供了相关信息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会使您的新活动成为堆叠中的唯一活动。