3

我有问题如何在 UWP 中实现子页面导航。该页面位于 RootFrame 中,我可以在导航中使用它。但我想使用这样的东西:

    <Page>
<Grid>
 <Frame x:Name="MyFrame"/>
</Grid>
</Page>

我想要的是,在 ViewModel 中使用控制 MyFrame 的 Navigate 方法。我可以从代码隐藏中调用该方法,但我正在使用 MVVM 开发我的应用程序。我不确定 Template10 是否可以与子框架一起使用。

我很感激任何建议。

编辑: 更多详细信息:我在页面中有枢轴控制。枢轴有 2 个选项卡(枢轴项)。数据透视项目的内容必须是可导航的。我的意思是:我是pivotitem 1,我需要一个Frame 并将其用于在pivotitem 中导航。我的问题是,如何使用或如何从 ViewModel 调用 pivotitem 中的框架,特别是我需要调用 Navigate 方法。现在我正在使用 Template10 的导航服务,它正在使用 rootframe。我不知道,如何将它用于其他比如说子帧。

4

4 回答 4

5

你总是可以做到这一点。

var nav = Bootstrapper.NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude, this.Frame);

这将为您提供页面中框架的导航服务。然后,您可以根据需要使用会话状态。

Bootstapper.SessionState["MyNav"] = nav;

从这里您的视图模型可以访问服务和导航。您可以对尽可能多的帧重复此操作。然后,您可以在视图模型中处理导航,而无需考虑框架的“位置”,只是您的逻辑需要它来导航。

这有意义吗?

于 2016-03-18T16:55:16.383 回答
2

我不知道您将如何触发导航更改,因此我假设它将从单击按钮开始。我还假设按钮的Command属性已经绑定到ICommand视图模型中的一个(相同的概念可以应用于不同类型的视图)。

我们现在要做的就是让ICommand实现调用我们的自定义NavigationService来执行内容切换。这个NavigationService类只不过是窗口全局框架的一个简单代理。它的主要导航方法可以很简单:

    public void Switch()
    {
        var rootFrame = Window.Current.Content as Frame;

        if ((rootFrame.Content as ParentPage) != null)
        {
            rootFrame.Navigate(typeof(ChildPage));   
        }
    }
于 2016-03-10T21:34:27.010 回答
2

因此,您已使用 Template10 对此进行了标记,但对于整个 UWP 而言,这似乎是一个更普遍的问题。我想知道您是否考虑过这种方法的所有固有复杂性——特别是与暂停和恢复相关的问题。对于您拥有的每个框架,您都需要保存和恢复导航状态,当您有嵌套框架时,这并不简单。您是否还考虑过全球导航的工作方式?

模板 10 确实支持多个 NavigationServices 的概念,因此也支持多个框架,但只有从您的角度来看才能创建它们。Template10 本身并不了解这些帧如何相互关联,因此无法在您有类似以下内容的情况下执行自动反向传播:

FrameA[Main->Page1->Page1:Pivot1.FrameB[View1->View2->View3]]

这里我们有两个框架——FrameA 和 FrameB。FrameA 已从 Main 导航到 Page1。Page1 有一个在 PivotItem1 中承载 FrameB 的 Pivot,并且 FrameB 已从 View1 导航到 View 2 并从 View2 导航到 View 3。

全局导航(即外壳返回等)将自动连接到 FrameA,因此您需要拦截该操作,然后为 FrameB 处理您自己的导航活动。

查看BackButtonBehavior以了解如何拦截全局后退,然后实施您自己的操作。

于 2016-03-14T20:44:36.210 回答
1

我不知道你是否可以做这样的事情.. 一种可能的解决方法是使用 Messenger 将消息从您的视图模型发送到视图背后的代码.. 我不喜欢这个解决方案,因为我之前说过你必须使用后面的页面代码..

于 2016-03-11T13:24:45.133 回答