【问题标题】:MvvmCross 4 support for UWP, AppShell missing FrameMvvmCross 4 支持 UWP,AppShell 缺少 Frame
【发布时间】:2015-11-21 09:01:03
【问题描述】:

我为支持 Windows 应用商店的 MvvmCross 应用程序创建了一个新解决方案,并且我想在 Windows 10 上支持 UWP。我已成功迁移 PCL,但使用提供的示例使基本 UWP 应用程序工作时遇到问题MS (NavigationMenu) 使用了他们为新的导航/命令模型推荐的 SplitView 和 AppShell 模式。我参考了一篇有用的博客文章 (http://stephanvs.com/implementing-a-multi-region-presenter-for-windows-10-uwp-and-mvvmcross/),它为我提供了有关如何将 mvvmcross 集成到 AppShell 的一些指导,但是由于 AppShell 没有定义有效的 Frame,因此启动失败。 Frame 是一个只读属性,我一直无法看到它的设置位置。

我正在使用 NavigationMenu 中的标准 AppShell 实现,并按照博文中的建议进行了以下更改:

public sealed partial class AppShell : MvxWindowsPage // was Page

public Frame AppFrame { get { return this.Frame; } } // was this.frame

除了报错后的代码,设置上没有区别。在查看 MvxWindowsPage 实现时,似乎没有什么特别之处,因为它仍然调用 Page 初始化。我有什么明显的遗漏吗?

【问题讨论】:

  • 试试这个:Frame currentFrame = (Frame) this.WrappedFrame.UnderlyingControl;

标签: mvvmcross uwp splitview


【解决方案1】:

因此,博客文章的链接是正确的,换句话说,您需要使用 MvvmCross 中的 MultiRegions 才能使其正常工作。 但是博文没有显示的是一个完整的工作版本......

我在我的 github 上添加了一个: https://github.com/Depechie/MvvmCrossUWPSplitView

一些建议带走,就像我在 cmets 中所说的那样。 您的 SplitView 将出现的视图需要有一个属性来返回一个有效的 Frame 以在注入新视图时查找。这可以像这样返回 return (Frame)this.WrappedFrame.UnderlyingControl; 在这里的代码中找到 https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/FirstView.xaml.cs#L13

您想要在 SplitView 中加载的所有视图都需要引用您在该 SplitView 中定义的区域,在我的例子中,我将其命名为 FrameContent,如下所示https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/FirstView.xaml#L48

因此,在所有要加载的视图中使用该名称作为区域属性,例如 [MvxRegion("FrameContent")] 此处示例 https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/SecondView.xaml.cs#L7

【讨论】:

  • 这很棒。我还有一个我似乎无法解决的问题。我想在启动时使用默认视图填充框架。该示例将框架留空,直到您选择一个选项。我曾尝试使用 ShowViewModel 从多个位置导航到页面(splitview VM 构造函数、Init 方法、在调用 start 方法后的设置等),但在我尝试过的每种情况下,视图都无法加载错误“在 DefaultView 中找不到区域 xxx”,搜索默认视图而不是框架的拆分视图。有什么想法吗?
  • 这个错误是因为在 MvvmCross 世界中,视图模型将在视图之前初始化。所以框架还不能加载内容。快速修复,在 firstview 上注册框架的 Loaded 事件,然后导航到任何视图模型。我已经用这个主体更新了我的 github 示例!
  • 完美!按照您的建议,我使用了附加的行为来处理 Loaded 事件。您的示例引用了我找不到的“核心:EventTriggerBehavior”,但指导很准确。非常感谢。
  • 哈,这是一个 nuget 包,它是新的 Microsoft UWP 行为,它们现在可用......
【解决方案2】:

我知道您尝试使用 Microsoft 提供的 SplitView 模板做什么。然而,由 MvvmCross 和 UWP 管理的事物之间存在不匹配。

默认情况下,MvvmCross 根据命名约定将 ViewModels 映射到 Views。您要做的是使用不符合默认 MvvmCross 约定的视图“AppShell”(派生自 Windows.UI.Xaml.Controls.Page)。

我选择实现此 SplitView (Hamburger) 功能的方式是完全删除提供的 AppShell 类。然后,我创建了一个名为 HomeView 的新视图(因为我有一个名为 HomeViewModel 的 ViewModel)并在那里添加了 SplitView 控件,如您上面提到的帖子中所述。

为了完整起见,我已按照您的要求使用 App.xaml.csHomeView.xaml 创建了 Gist。你可以在这里找到它们:https://gist.github.com/Stephanvs/7bb2cdc9dbf15cb7a90f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多