MvvmCross 5.x 的 MvvmCross 侧边栏导航

2024-04-09

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

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

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

我使用的是MvvmCross 5.x,并且没有与5.x版本兼容的示例。 有谁能给我提供一个可用的示例吗?


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

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

  1. 确保将 MvvmCross iOS 支持包添加到您的 iOS 项目中:Install-Package MvvmCross.iOS.Support -Version 5.0.2(或使用图形用户界面)
  2. 配置您的 iOS 项目以使用MvxSidebarPresenter通过将以下代码添加到SetupiOS 项目中的类:

    protected override IMvxIosViewPresenter CreatePresenter()
    {
        return new MvxSidebarPresenter((MvxApplicationDelegate)ApplicationDelegate, Window);
    }
    
  3. 创建一个充当弹出菜单的视图控制器,并用MvxSidebarPresentationAttribute。该视图控制器将充当您的菜单。您可以(或者更好应该)将其链接到将处理导航部分(当用户选择菜单项时)的视图模型。这个视图控制器可能看起来像这样:

    [MvxSidebarPresentation(MvxPanelEnum.Left, MvxPanelHintType.PushPanel, false)]
    public class LeftPanelView : MvxViewController<LeftPanelViewModel>
    {
        ...
    }
    
  4. 要确保您的主视图充当根控制器,只需添加MvxSidebarPresentationAttribute到主视图控制器并确保属性Panel被设定为Center, HintType被设定为ResetRoot and ShowPanel被设定为true),像这样:

    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true)]
    public class HomeView : MvxViewController<HomeViewModel>
    {
        ...
    }
    
  5. 对于所有子视图(从主视图打开),请确保设置MvxSidebarPresentationAttribute与财产Panel set to Center, HintType set to PushPanel并根据是否要在子页面上显示菜单按钮设置ShowPanel to true or false,就像这样:

    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.PushPanel, true)]
    public class ChildView : MvxViewController<ChildViewModel>
    {
        ...
    }
    
  6. 最后一步是为菜单中的所有其他按钮设置视图控制器。这些可以简单地用MvxModalPresentationAttribute属性将它们作为对话框打开(详细文档可以找到here https://www.mvvmcross.com/documentation/platform/ios-view-presenter?scroll=548)。一个例子可能看起来像这样:

    [MvxModalPresentation(ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen, ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve)]
    public partial class ModalView : MvxViewController<ModalViewModel>
    {
        ...
    }
    

要打开不同的视图,您可以使用 MvvmCross 中的新导航服务。为此,只需允许 MvvmCross IoC 容器将实例注入到视图模型构造函数中(更多详细信息可以在here https://www.mvvmcross.com/documentation/fundamentals/navigation?scroll=62):

public class HomeViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

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

EDIT 1:为了能够在菜单按钮上显示图标,您需要实现IMvxSidebarMenu构成菜单的视图控制器上的界面(参见步骤 3)。通过实现此接口,您可以覆盖菜单的默认行为,示例可以找到here https://github.com/MvvmCross/MvvmCross/blob/develop/TestProjects/iOS-Support/XamarinSidebar/MvvmCross.iOS.Support.Sidebar/Views/BaseMenuViewController.cs(这是演示 MvvmCross 的一部分Xamarin侧边栏 https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/iOS-Support/XamarinSidebar应用)。

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

EDIT 3:有一种方法可以完全实现该模式。我们可以自定义堆栈导航 UI,这样我们就可以模仿 Android 工具栏之类的东西。这种方法是有效的,它基本上要求我们隐藏导航栏并创建具有汉堡菜单、后退按钮和其他按钮的自定义工具栏,并将其放在子视图的上部。以下是关闭和后退按钮所需的代码:

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);
            };
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MvvmCross 5.x 的 MvvmCross 侧边栏导航 的相关文章

  • 在 WPF 中创建侧边栏 - 像 Windows 桌面应用程序一样的弹出窗口

    我想做的是在 WPF 中创建一个桌面应用程序 其 UI 是这样的 一个小图标将保持固定在屏幕左边缘的中心 单击 或悬停 时将滑动打开一个侧边栏 如谷歌 桌面栏 沿着屏幕左边缘运行 固定位置 无法移动 请注意 我要求的可能类似于应用程序栏 但
  • WPF 的现代 UI - 导航

    如何在页面之间传递参数 我尝试向页面 uri 添加参数 但它不起作用 因为我无法在用户控件上使用 onNavieratedTo 事件 请帮忙 您必须使用 OnFragmentNavigation public void OnFragment
  • 如何在Sphinx中展开侧边栏目录树上的所有小节?

    我想知道是否有一种方法可以扩展包含在标题下的所有小节index rst file 举个例子 它是这样的 Section 1 Section 2 Section 3 这就是我希望的样子 Section 1 Subsection 1 1 Sub
  • 如何关闭 Firefox 中的侧边栏

    我的 Firefox 插件中有一个侧边栏 我希望此侧边栏具有以下行为 如果在关闭浏览器时侧边栏打开 我应该强制关闭侧边栏 以便下次打开浏览器时侧边栏不处于打开状态 我正在尝试这样做 uninit function var sidebarWi
  • 什么是符合 WAI-ARIA 标准的导航栏/菜单实现

    我们正在为门户网站的主导航菜单实施 即添加 WAI ARIA 支持 菜单如下所示 菜单采用经典的方式实现 ul li a DOM 树 使用 CSS 设计 看起来像水平选项卡 这种小部件的 WAI ARIA 兼容实现是什么 我已经阅读了 w3
  • React Native 导航显示白屏

    使用反应本机导航进行编译时出现白屏 请问为什么会这样 我似乎没有收到任何错误代码 什么也没有 我只看到一个白屏 为什么会这样呢 我的代码看起来像这样 表明到目前为止我似乎没有任何错误 Here is what the Error seems
  • 如何正确实现固定侧边栏?

    I m trying to accomplish this design Where the sidebar will be fixed but the right side the main content will scroll ver
  • mvvmcross 可扩展列表视图

    我只是想知道 ExpandableListViews 的功能或类似于 ExpandableListViews 的功能是否潜伏在 Mvvmmcross 框架内 或者这种类型的控件不适用于多平台要求 该功能位于http deapsquatter
  • 在 Kinect 示例中用 Google Earth 地球仪替换可平移的世界地图图像

    我需要有关如何使用 Kinect 手势而不是使用鼠标 键盘导航来控制 Google 地球的基本指导 我已经运行了 Kinect Developer 工具包示例 并且有一个名为 C 的交互式画廊 允许平移世界地图 它是静态图像 这是其文档的链
  • MVVCross:将枚举值作为 Android 的 CommandParameter 传递

    我想将枚举值作为命令参数传递 我的枚举定义为 public enum MyEnum One Two 在我的 axml 中我有 local MvxBind Click MyCommand CommandParameter MyEnum One
  • 如何在 Xamarin Forms 中处理/取消后退导航

    我尝试通过覆盖来使用后退导航OnBackButtonPressed 但不知怎的 它根本没有被调用 我正在使用ContentPage以及最新的 1 4 2 版本 好吧 经过几个小时我终于弄清楚了 它分为三个部分 1 处理 Android 上的
  • MVVMCross - 将相同的 ViewModel 绑定到 2 个不同的 View

    基本上我的场景如下 我有 1 个视图绑定到 ViewModel 并带有一个项目列表 项目的类是我的模型中的类 每次从此 列表视图 中的列表中选择一个项目时 其字段都会在另一个 详细信息视图 中编辑 这与客户管理示例场景相同 其中从列表 在
  • 强调 WordPress 主题 - 添加第二个侧边栏

    使用下划线主题 s 启动 WordPress 网站 我已经有一个侧边栏可以工作 但想在同一页面上制作第二个侧边栏 包含不同的小部件 我已将新的侧边栏添加到functions php 中 它出现在Wordpress 登录屏幕中 我可以将小部件
  • 如何仅使用CSS和HTML实现带有标题+可滚动侧边栏+可滚动内容的应用程序布局[重复]

    这个问题在这里已经有答案了 我需要构建一个标准的 Web 应用程序 其中包含标题 左侧边栏 如果选项太多则可滚动 和内容大小合适 这是我的尝试 wrapper font size 14px height 100 width 100 marg
  • 从页面内重新加载 .NET MAUI 中的瞬态页面

    我有一个 NET MAUI 应用程序 其中一个页面在 MauiProgram cs 中注册为瞬态 我希望能够使用页面本身上的按钮重置页面 但不知道如何操作 请有人帮助我 我已经尝试过使用这段代码 但它没有做任何事情 RelayCommand
  • 更改 Android 上活动动画的 z 顺序

    有没有办法反转活动动画的 z 顺序 基本上 当您启动新活动时 它会被添加到后台堆栈 并且其窗口会添加到前一个活动的窗口上 有时稍后返回时 从后台堆栈获取的活动会在顶部活动下方显示其窗口 大多数时候这是完全有道理的 但我对这种行为有以下问题
  • 如何在主题激活时填充侧边栏上的小部件

    我想做的是在主题激活时使用一些默认小部件预先填充侧边栏小部件区域 if dynamic sidebar sidebar 确实添加了小部件 但它没有显示在小部件部分的侧栏中 并且 if is active sidebar sidebar 如果
  • 定义了特定 post_type 的帖子内的页面导航在 Wordpress 中不起作用

    http lakers sonikastudios com gallery sample gallery post 1 http lakers sonikastudios com gallery sample gallery post 1
  • Flutter:go_router如何将多个参数传递到其他屏幕?

    在普通颤动中 我用来将多个参数传递到其他屏幕 如下所示 Navigator of context push MaterialPageRoute builder gt CatalogFilterPage list list bloc bloc
  • JSF 2.0 隐式导航,不同的观点

    我正在寻找对 JSF 2 0 隐式导航及其如何与视图一起工作的良好解释 更准确地说 我知道从操作方法中我可以返回一个字符串 它是操作的结果 如果存在文件名与结果匹配的 JSF 视图 那么这就是隐式导航 现在 我的问题是 如果从文件夹内的视图

随机推荐

  • 无法杀死的控制台窗口

    我正在 Visual C 2008 下使用 GLUT 开发基于 OpenGL 的 2d 模拟 有时当我遇到断言 或未处理的异常并闯入调试器时 GLUT 显示窗口关闭 但控制台窗口保持打开状态 它们只是不能杀了 它们不会出现在任务管理器 进程
  • 计算的属性不会在 Powershell 中引发异常。有哪些解决办法?

    显然有一个通过设计怪癖 https connect microsoft com PowerShell feedback details 782806 calculated properties do not throw exceptions
  • 使用 Firefox 打开确认对话框时显示“$apply already in Progress”

    我 有时 变得很奇怪 申请已在进行中在以下看似无辜的情况下打开确认对话框时出错 var mod angular module app mod controller ctrl function scope interval http scop
  • 如何知道ngOnChanges中哪些@Input发生了变化?

    我正在使用 Angular 2 现在我有两个 inputaa and bb 我想要做 If aa改变 做某事 If bb改变 做其他事情 如何知道哪些 Input发生了变化ngOnChanges Thanks Input aa Input
  • 分析心率监测器返回的数据

    我正在尝试通过蓝牙读取心率监视器传输的数据 但我真的不知道如何读取心率监视器返回的字节 每个供应商可能都有自己的将数据包装成字节的方法 但是如何将这些字节转换为某种可读格式 以便我可以分析其中的变化 例如 ASCII 值或某些十六进制值 我
  • 如何调试特定的 JavaScript 点击事件?

    在雅虎天气页面上 有一个链接标记为C改变温度单位Fahrenheit to Celsius 我正在寻找调试此操作并了解 JavaScript 在幕后执行的内容 将 F 转换为 C 调试此类操作的方法是什么 Link http weather
  • phpMyAdmin 错误 504 网关超时重新加载

    我的 phpmyadmin 有一个非常烦人的问题 它出乎意料地出现 据我所知 我的专用服务器没有发生任何变化 当我尝试在浏览器中执行任何查询或显示执行时间超过 1 秒的视图时 Windows 7 上的 firefox 即行为相同 我收到以下
  • 在类中声明一个数组。 C++

    我想创建一个初始化数组和函数的类push向数组添加一个元素而不是打印它 作为初学者 我知道初始化有问题 除了函数之外一切正常push 它不打印数组 我的班级出了什么问题 include
  • 使用 exiftool 编辑 MP4 元数据

    我有一个 MP4 文件Title元数据 exiftool movie mp4 这使 Audio Bits Per Sample 16 Audio Sample Rate 48000 Handler Type Metadata Handler
  • 获取USB设备的父信息C++

    我正在开发一个 MFC 工具 用于检查连接的 USB 设备的一些驱动程序信息 例如位置信息 父级 硬件 ID 等 我已经获得了我想要的所有其他信息 但我一直在获取设备父级信息 我用过安装程序API dll在我的代码中获取设备信息 使用获取U
  • MSBuild with Azure - PublishProfileSet 计算结果为“”

    我正在尝试将我的项目部署到 Azure 我首先在 Azure 上研究 EF 代码几个小时 但我只用了一次就创建了一个用户 我去发布更新 现在收到以下错误 Invoke build failed due to exception Expect
  • QGraphicsView 和 QGraphicsItem:缩放视图矩形时不缩放项目

    我正在使用 QtQGraphicsView and QGraphicsItem 子类 当视图矩形更改时 有没有办法不缩放视图中项目的图形表示 例如放大时 默认行为是我的项目相对于我的视图矩形进行缩放 我想可视化二维点 这些点应该由一个细矩形
  • 我怎样才能卷曲深度爬行?

    我的 Deepcrawl 爬行仅给出 null 值 ch curl init curl setopt ch CURLOPT URL https api deepcrawl com accounts 00000 projects 195334
  • is.na() 应用于非(列表或向量)类型“NULL”意味着什么?

    我想从没有 NA 的 data frame 中选择具有前向过程的 Cox 模型 这是一些示例数据 test lt data frame x 1 runif 100 0 1 x 2 runif 100 0 5 x 3 runif 100 10
  • 检测 iOS 中的旋转变化

    我正在制作一个 iOS 应用程序 需要在旋转时进行一些界面重新排列 我试图通过实施来检测这一点 void orientationChanged NSNotification note 但这会在设备正面朝上或正面朝下时向我发出通知 我想要一种
  • 如何将数组对象中的数据保存到 MongoDB

    我在将数据从数组对象保存到 MongoDB 数据库时遇到问题 我有带有嵌入子文档的主文档的架构 主文档和所有其他子文档的保存均成功 但子文档是数组除外 正如您从屏幕截图中看到的 子文档中的字段没有保存到数据库中 Robo 3T 的屏幕截图
  • TaskGraph.useFilter 替代 kotlin dsl

    我正在寻找 gradle 中这行代码的替代方案 并且正在寻找 kotlin dsl 中的对应部分 任何人都可以对此进行一些说明 因为它阻止了我的构建 并且由于 usefilter 在 kotlin dsl 中不可用而不知所措 gradle
  • 双击:缩放 Android MapView?

    经过一些工作后 我的路线应用程序运行良好 我唯一想添加的是双击放大功能 但我不知道如何添加 你能给我一个提示吗 我也一直在寻找答案 示例 但找不到有效的代码 最后 这是对我有用的代码 MyMapActivity java public cl
  • 确定一个数字是否是十的倍数或在一组特定范围内

    我的程序中有一些需要的循环 我可以写出伪代码 但我不完全确定如何逻辑地编写它们 I need if num is a multiple of 10 do this if num is within 11 20 31 40 51 60 71
  • MvvmCross 5.x 的 MvvmCross 侧边栏导航

    我要为我的应用程序实现两种类型的导航 即侧边栏导航和父子导航 我的应用程序从汉堡 侧边栏 菜单开始 侧边栏菜单中的第一项应执行导航堆栈的重置并打开主视图 主视图控制器应该启动根堆栈导航 因此主视图上的每个按钮都应该打开一个新视图 新视图上的