gpt4 book ai didi

navigation - MvvmCross 5.x 的 MvvmCross 侧边栏导航

转载 作者:行者123 更新时间:2023-12-04 22:18:50 25 4
gpt4 key购买 nike

我要同时为我的应用程序实现两种类型的导航,侧边栏导航和父子导航。
我的应用程序从汉堡(侧边栏)菜单开始。

侧边栏菜单中的第一项应执行导航堆栈的重置并打开主视图。
主视图 Controller 应该启动根堆栈导航,因此主视图上的每个按钮都应该打开一个新 View ,新 View 上的按钮应该打开另一个 View 等。

侧边栏菜单中的每个其他项目都应以对话框的形式打开一个新 View 。

我使用的是 MvvmCross 5.x,没有与 5.x 版本兼容的示例。
有没有人可以指点我一个可用的样本?

最佳答案

首先,我假设您正在尝试为 iOS 实现此功能。在 Android 的情况下,您可以简单地使用抽屉导航。

iOS 上的示例尚未转换为 MvvmCross 5.x(我将开始这样做 a.s.a.p.),但这应该是微不足道的。让我试着引导你完成它:

  • 确保将 MvvmCross iOS 支持包添加到您的 iOS 项目中:Install-Package MvvmCross.iOS.Support -Version 5.0.2 (或使用 GUI)
  • 配置您的 iOS 项目以使用 MvxSidebarPresenter通过将以下代码添加到 Setup iOS 项目中的类:
    protected override IMvxIosViewPresenter CreatePresenter()
    {
    return new MvxSidebarPresenter((MvxApplicationDelegate)ApplicationDelegate, Window);
    }
  • 创建一个 View Controller ,用作弹出菜单并用 MvxSidebarPresentationAttribute 装饰它.此 View Controller 将充当您的菜单。您可以(或更好地应该)将其链接到将处理导航部分的 View 模型(当用户选择菜单项时)。这个 View Controller 可能看起来像这样:
    [MvxSidebarPresentation(MvxPanelEnum.Left, MvxPanelHintType.PushPanel, false)]
    public class LeftPanelView : MvxViewController<LeftPanelViewModel>
    {
    ...
    }
  • 要确保您的主视图充当根 Controller ,只需添加 MvxSidebarPresentationAttribute到主视图 Controller 并确保属性 Panel设置为 Center , HintType设置为 ResetRootShowPanel设置为 true ),像这样:
    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true)]
    public class HomeView : MvxViewController<HomeViewModel>
    {
    ...
    }
  • 对于所有 subview (从主视图打开),确保设置 MvxSidebarPresentationAttribute与属性(property) Panel设置为 Center , HintType设置为 PushPanel并根据您是否要在子页面上显示菜单按钮设置 ShowPaneltruefalse ,像这样:
    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.PushPanel, true)]
    public class ChildView : MvxViewController<ChildViewModel>
    {
    ...
    }
  • 最后一步是为菜单中的所有其他按钮设置 View Controller 。这些可以简单地用 MvxModalPresentationAttribute 装饰。属性以将它们作为对话框打开(可以找到详细文档 here )。一个示例可能如下所示:
    [MvxModalPresentation(ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen, ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve)]
    public partial class ModalView : MvxViewController<ModalViewModel>
    {
    ...
    }

  • 要打开不同的 View ,您可以使用 MvvmCross 中的新导航服务。为此,只需允许 MvvmCross IoC 容器将一个实例注入(inject)到您的 View 模型构造函数中(可以找到更多详细信息 here ):
    public class HomeViewModel : MvxViewModel
    {
    private readonly IMvxNavigationService _navigationService;

    public HomeViewModel(IMvxNavigationService navigationService)
    {
    _navigationService = navigationService ?? throw new ArgumentNullException(nameof(navigationService));
    }
    }

    编辑 1:
    为了能够在菜单按钮上显示图标,您需要实现 IMvxSidebarMenu构成菜单的 View Controller 上的界面(参见步骤 3)。通过实现此接口(interface),您可以覆盖菜单的默认行为,示例可以在 here 中找到。 (这是演示 MvvmCross XamarinSidebar 应用程序的一部分)。

    编辑 2:
    我错误地建议您可以在推送到导航堆栈上的 subview 上显示菜单(或其图标)按钮。情况并非如此,被压入堆栈的 subview 不会显示菜单按钮。在这些情况下, ShowPanel属性被完全忽略。

    编辑 3:
    有一种方法可以完全实现这种模式。我们可以自定义堆栈导航 UI,这样我们就可以模仿 Android 工具栏之类的东西。这种方法是有效的,它基本上要求我们隐藏导航栏并创建我们的自定义工具栏,其中包含汉堡菜单、后退按钮和其他按钮,并将其放在 subview 的上部。这是关闭和返回按钮所需的代码:
    public override void ViewDidLoad()
    {
    base.ViewDidLoad();
    NavigationController.NavigationBarHidden = true;

    btnClose.TouchUpInside += (object sender, EventArgs e) =>
    {
    NavigationController.NavigationBarHidden = false;
    NavigationController.PopViewController(false);
    };

    btnShowMenu.TouchUpInside += (object sender, EventArgs e) =>
    {
    var sideMenu = Mvx.Resolve<IMvxSidebarViewController>();
    sideMenu?.Open(MvxPanelEnum.Left);
    };
    }

    关于navigation - MvvmCross 5.x 的 MvvmCross 侧边栏导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44497462/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com