5

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

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

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

4

2 回答 2

11

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

  • 操纵 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)一些标准演示器中是如何实现的。

于 2013-07-04T17:28:56.720 回答
5

有一篇不错的文章,其中包含有关操作的信息。这涵盖了基于 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将使您的新活动成为堆栈中唯一的活动。

于 2015-11-10T19:09:50.417 回答