我有问题如何在UWP中实现子页面导航。该页面位于RootFrame中,我可以在导航中使用。但我想使用这样的东西:
<Page>
<Grid>
<Frame x:Name="MyFrame"/>
</Grid>
</Page>
我想要的是,在ViewModel中使用控制MyFrame的Navigate方法。我可以从代码隐藏调用该方法,但我正在使用MVVM开发我的应用程序。我不确定,如果Template10可以使用子帧。
我感谢任何建议。
修改 更多细节: 我在页面中有枢轴控制。枢轴有2个选项卡(pivotitems)。 pivotitem的内容必须是可导航的。我的意思是:我的第一部分,我需要有一个框架并用它在枢轴实现中导航。我的问题是,如何使用或如何从ViewModel调用pivotitem中的帧,特别是我需要调用Navigate方法。现在我使用Template10的导航服务,并且它正在使用rootframe。我不知道如何将其用于其他让我们说的子帧。
答案 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;代码背后......