MvvmCross 4支持UWP,AppShell缺少Frame

时间:2015-11-18 14:19:45

标签: mvvmcross uwp splitview

我为支持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初始化。有什么东西显而易见吗?

2 个答案:

答案 0 :(得分:2)

因此,博客帖子的链接是正确的,换句话说,您需要使用MvvmCross的MultiRegions来实现这一点。 但博客文章没有显示的是一个完整的工作版本......

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

正如我在评论中所说的那样,有些指示可以带走。 您的SplitView将出现在哪里,需要有一个属性来返回一个有效的Frame,以便在注入新视图时查找。这可以像https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/FirstView.xaml.cs#L13

中的代码中找到的return (Frame)this.WrappedFrame.UnderlyingControl;一样返回

要在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

答案 1 :(得分:1)

我看到您正在尝试使用Microsoft提供的SplitView模板。然而,MvvmCross和UWP管理的事情之间存在不匹配。

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

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

为了完整性,我已根据您的要求创建了一个带有App.xaml.csHomeView.xaml的要点。您可以在此处找到它们:https://gist.github.com/Stephanvs/7bb2cdc9dbf15cb7a90f