使用Template10在页面内导航

时间:2016-03-10 20:39:35

标签: c# mvvm windows-runtime win-universal-app template10

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

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

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

我感谢任何建议。

修改 更多细节: 我在页面中有枢轴控制。枢轴有2个选项卡(pivotitems)。 pivotitem的内容必须是可导航的。我的意思是:我的第一部分,我需要有一个框架并用它在枢轴实现中导航。我的问题是,如何使用或如何从ViewModel调用pivotitem中的帧,特别是我需要调用Navigate方法。现在我使用Template10的导航服务,并且它正在使用rootframe。我不知道如何将其用于其他让我们说的子帧。

4 个答案:

答案 0 :(得分:5)

你可以随时这样做。

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

这将为您提供页面中框架的导航服务。如果愿意,您可以使用会话状态。

Bootstapper.SessionState["MyNav"] = nav;

从这里,您的视图模型可以访问服务并导航。您可以重复此操作以获得尽可能多的帧。然后,您可以在视图模型中处理导航,而无需考虑&#34;其中&#34;框架是,你的逻辑需要它导航。

这有意义吗?

答案 1 :(得分:2)

我不知道你将如何触发导航更改,所以我认为它将从按钮点击开始。我还假设按钮的Command属性已经绑定到viewmodel中的ICommand(相同的概念可以应用于不同类型的视图)。

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

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

        if ((rootFrame.Content as ParentPage) != null)
        {
            rootFrame.Navigate(typeof(ChildPage));   
        }
    }

答案 2 :(得分:2)

所以你用Template10标记了它,但它似乎是整个UWP的一个更普遍的问题。我想知道你是否考虑过这种方法的所有固有的复杂性 - 特别是与暂停和恢复有关。对于您拥有的每个帧,您需要保存和恢复导航状态,当您有嵌套帧时,这不是直接的。您是否还考虑了全球导航的工作原理?

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

FrameA [Main-&GT; Page1-&GT;第1页:Pivot1.FrameB [View1-&GT; View2-&GT; VIEW3]]

  

这里我们有两个框架 - FrameA和FrameB。 FrameA已导航   主要到Page1。 Page1有一个Pivot,它在PivotItem1和。中托管FrameB   FrameB已从View1导航到View 2,从View2导航到View 3。

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

看一下BackButtonBehavior,了解如何拦截全球背景,然后实施自己的行动。

答案 3 :(得分:1)

我不知道你是否可以做那样的事情...... 一种可能的解决方法是使用Messenger将视图模型中的消息发送到后面的视图代码..我不是这个解决方案的粉丝,因为正如我之前所说,你必须使用页面& #39;代码背后......