MvvMCross 导航回多个视图模型/截断导航堆栈
Posted
技术标签:
【中文标题】MvvMCross 导航回多个视图模型/截断导航堆栈【英文标题】:MvvMCross navigate back multiple viewmodels / truncate navigation stack 【发布时间】:2013-07-02 17:30:19 【问题描述】:我有两个关于 MvvMCross 导航的问题。
-
如何返回导航堆栈上的视图模型?分别:如何返回指定数量的视图模型?
如何截断导航堆栈?
例如:A|B|C 在堆栈上,导航到 D 使堆栈看起来像:D
【问题讨论】:
【参考方案1】:操作后台堆栈的功能是特定于平台和应用程序的 - 例如:
操纵 android 活动回栈与操纵 ios UINavigation 控制器非常不同 这取决于您的应用是否使用选项卡、活动、片段、弹出、模式、汉堡菜单等因此,像这样的 UI 更改的实际实现并未在 MvvmCross 中定义。
相反,您可以在应用程序中实现presenter
。
您需要遵循的基本流程是:
弄清楚你的应用结构是什么以及你想要达到什么效果
为此效果,声明一个自定义演示提示 - 例如
public class MyFunkyPresentationHint : MvxPresentationHint
public int DegreeOfFunkiness get; set;
-
您可以从任何 ViewModel 创建和发送此提示
base.ChangePresentation(new MyFunkyPresentationHint() DegreeOfFunkiness=27 );
-
在您的自定义演示器中,您可以执行您想要的 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
将使您的新活动成为堆栈中唯一的活动。
【讨论】:
以上是关于MvvMCross 导航回多个视图模型/截断导航堆栈的主要内容,如果未能解决你的问题,请参考以下文章
使用 mvvmcross 显示视图模型时无法解析当前的***活动
Xamarin iOS:MvvMCross 绑定导航项的后退按钮
Mvvmcross - 从常规活动中显示 mvvmcross 视图模型
MvvmCross 与 Xamarin.Forms 和自定义 iOS 渲染器 - 防止导航滑动 iOS - MasterDetail