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

5

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

  1. 如何返回到导航堆栈中的一个视图模型?或者说:如何返回指定数量的视图模型?
  2. 如何截断导航堆栈?

    例如:在堆栈上有 A|B|C,导航到 D 后,堆栈变为:D

2个回答

11

操作返回栈的功能因平台和应用程序而异,例如:

  • 在 Android 活动返回栈和 iOS 导航控制器之间操作非常不同
  • 这取决于您的应用程序是否使用选项卡、活动、片段、弹出、模态框、汉堡菜单等

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

相反,您需要在应用程序的 presenter 中实现。

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

  1. 确定您的应用程序结构和要实现的效果

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

    public class MyFunkyPresentationHint : MvxPresentationHint
    {
        public int DegreeOfFunkiness { get; set; } 
    }
  1. 您可以从任何ViewModel创建并发送此提示
    base.ChangePresentation(new MyFunkyPresentationHint() { DegreeOfFunkiness=27 });
  1. 在您的自定义 Presenter 中,您可以执行所需的后退栈屏幕操作:
    public override void ChangePresentation(MvxPresentationHint hint)
    {
        if (hint is MyFunkyPresentationHint)
        {
            // your code goes here
            return;
        }

        base.ChangePresentation(hint);
    }

查看自定义Presenter的示例,请参见:http://slodge.blogspot.com/2013/06/presenter-roundup.html

有关返回栈操纵的示例之一,请查看某些标准Presenter中如何实现Close(this)


5

这里有一篇很好的文章,介绍了如何执行基于MVVMCross的演示器使用。文章涵盖了基于iOS和Android片段的导航。然而,还有一种导航方式是基于Activity的。在这种情况下,可以使用Android意图(intents),并为其添加一些标志来帮助实现。

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会使您的新活动成为堆栈上唯一的活动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接