MvvMCross导航回多个视图模型/截断导航堆栈

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

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

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

操作后端堆栈的function是平台和应用程序特定的 – 例如:

  • 与iOS UINavigation控制器不同的是,操作Android活动的后台堆栈是非常不同的
  • 这取决于你的应用程序是否使用标签,活动,片段,popup窗口,模态,汉堡菜单等

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

相反,由您来实现在您的应用程序presenter

你需要遵循的基本stream程是:

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

  2. 为此,请声明一个自定义的显示提示 – 例如

  public class MyFunkyPresentationHint : MvxPresentationHint { public int DegreeOfFunkiness { get; set; } } 
  1. 您可以从任何ViewModel创build并发送此提示
  base.ChangePresentation(new MyFunkyPresentationHint() { DegreeOfFunkiness=27 }); 
  1. 在你的自定义主持人,你可以做你想要的后台屏幕黑客:
  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

有关堆栈操作的一个示例,请参阅某些标准的演示者如何实现Close(this)

有一个很好的文章, 在这里做的信息。 这涵盖基于iOS和Android片段的导航。 缺less基于活动的导航的情况。 对于这种特殊情况,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 ActivityFlags.ClearTask | ActivityFlags.NewTask将使您的新活动成为唯一的堆栈。