使用 Template10 在页面内导航
Navigation within Page using Template10
我对如何在 UWP 中实现子页面导航有疑问。该页面位于 RootFrame 中,我可以在导航中使用它。但我想使用这样的东西:
<Page>
<Grid>
<Frame x:Name="MyFrame"/>
</Grid>
</Page>
我想要的是,在ViewModel中使用Navigate方法控制MyFrame。我可以从代码隐藏调用该方法,但我正在使用 MVVM 开发我的应用程序。我不确定 Template10 是否可以使用子框架。
感谢任何建议。
编辑:
更多细节:
我有页面中的枢轴控件。枢轴有 2 个选项卡(枢轴项)。枢轴项的内容必须是可导航的。我的意思是:我的数据透视项 1,我需要一个框架并将其用于数据透视项中的导航。我的问题是,如何使用或如何从 ViewModel 调用 pivoitem 中的框架,尤其是我需要调用 Navigate 方法。现在我正在使用 Template10 的导航服务,它与根框架一起工作。我不知道,如何将它用于其他比方说子帧。
我不知道您将如何触发导航更改,所以我假设它将从单击按钮开始。我还假设按钮的 Command
属性 已经绑定到视图模型中的 ICommand
(相同的概念可以应用于不同类型的视图)。
我们现在要做的就是让 ICommand
实现调用我们的自定义 NavigationService
来执行内容切换。这个 NavigationService
class 只不过是 window 全局框架的简单代理。它的主要导航方法可以简单到:
public void Switch()
{
var rootFrame = Window.Current.Content as Frame;
if ((rootFrame.Content as ParentPage) != null)
{
rootFrame.Navigate(typeof(ChildPage));
}
}
我不知道你是否可以做这样的事情..
一种可能的解决方法是使用 Messenger 从您的视图模型向视图的后台代码发送消息。不过我不喜欢这个解决方案,因为正如我之前所说,您必须使用页面的后台代码..
所以您已经用 Template10 标记了这个问题,但对于整个 UWP 来说这似乎是一个更普遍的问题。我想知道您是否考虑过这种方法的所有内在复杂性——特别是与暂停和恢复相关的复杂性。对于您拥有的每个框架,您都需要保存和恢复导航状态,这在您有嵌套框架时并不直接。您是否也考虑过全局导航的工作原理?
模板 10 确实支持多个 NavigationServices 的概念,因此支持多个框架,但只能从您的角度创建它们。 Template10 本身并不理解这些帧如何相互关联,因此无法在您有类似内容的情况下执行自动反向传播:
FrameA[Main->Page1->Page1:Pivot1.FrameB[View1->View2->View3]]
Here we have two frames - FrameA and FrameB. FrameA has navigated from
Main to Page1. Page1 has a Pivot that hosts FrameB in PivotItem1 and
FrameB has navigated from View1 to View 2 and from View2 to View 3.
全局导航(即 shell 后退等)将自动连接到 FrameA,因此您需要拦截该操作,然后为 FrameB 处理您自己的导航 activity。
查看 BackButtonBehavior 了解如何拦截全局返回,然后执行您自己的操作。
您随时可以这样做。
var nav = Bootstrapper.NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude, this.Frame);
这将为您的页面框架提供导航服务。然后,您可以根据需要使用会话状态。
Bootstapper.SessionState["MyNav"] = nav;
从这里您的视图模型可以访问服务和导航。您可以对尽可能多的帧重复此操作。然后,您可以在不考虑 "where" 框架的情况下处理视图模型中的导航,只是您的逻辑需要它进行导航。
这有意义吗?
我对如何在 UWP 中实现子页面导航有疑问。该页面位于 RootFrame 中,我可以在导航中使用它。但我想使用这样的东西:
<Page>
<Grid>
<Frame x:Name="MyFrame"/>
</Grid>
</Page>
我想要的是,在ViewModel中使用Navigate方法控制MyFrame。我可以从代码隐藏调用该方法,但我正在使用 MVVM 开发我的应用程序。我不确定 Template10 是否可以使用子框架。
感谢任何建议。
编辑: 更多细节: 我有页面中的枢轴控件。枢轴有 2 个选项卡(枢轴项)。枢轴项的内容必须是可导航的。我的意思是:我的数据透视项 1,我需要一个框架并将其用于数据透视项中的导航。我的问题是,如何使用或如何从 ViewModel 调用 pivoitem 中的框架,尤其是我需要调用 Navigate 方法。现在我正在使用 Template10 的导航服务,它与根框架一起工作。我不知道,如何将它用于其他比方说子帧。
我不知道您将如何触发导航更改,所以我假设它将从单击按钮开始。我还假设按钮的 Command
属性 已经绑定到视图模型中的 ICommand
(相同的概念可以应用于不同类型的视图)。
我们现在要做的就是让 ICommand
实现调用我们的自定义 NavigationService
来执行内容切换。这个 NavigationService
class 只不过是 window 全局框架的简单代理。它的主要导航方法可以简单到:
public void Switch()
{
var rootFrame = Window.Current.Content as Frame;
if ((rootFrame.Content as ParentPage) != null)
{
rootFrame.Navigate(typeof(ChildPage));
}
}
我不知道你是否可以做这样的事情.. 一种可能的解决方法是使用 Messenger 从您的视图模型向视图的后台代码发送消息。不过我不喜欢这个解决方案,因为正如我之前所说,您必须使用页面的后台代码..
所以您已经用 Template10 标记了这个问题,但对于整个 UWP 来说这似乎是一个更普遍的问题。我想知道您是否考虑过这种方法的所有内在复杂性——特别是与暂停和恢复相关的复杂性。对于您拥有的每个框架,您都需要保存和恢复导航状态,这在您有嵌套框架时并不直接。您是否也考虑过全局导航的工作原理?
模板 10 确实支持多个 NavigationServices 的概念,因此支持多个框架,但只能从您的角度创建它们。 Template10 本身并不理解这些帧如何相互关联,因此无法在您有类似内容的情况下执行自动反向传播:
FrameA[Main->Page1->Page1:Pivot1.FrameB[View1->View2->View3]]
Here we have two frames - FrameA and FrameB. FrameA has navigated from Main to Page1. Page1 has a Pivot that hosts FrameB in PivotItem1 and FrameB has navigated from View1 to View 2 and from View2 to View 3.
全局导航(即 shell 后退等)将自动连接到 FrameA,因此您需要拦截该操作,然后为 FrameB 处理您自己的导航 activity。
查看 BackButtonBehavior 了解如何拦截全局返回,然后执行您自己的操作。
您随时可以这样做。
var nav = Bootstrapper.NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude, this.Frame);
这将为您的页面框架提供导航服务。然后,您可以根据需要使用会话状态。
Bootstapper.SessionState["MyNav"] = nav;
从这里您的视图模型可以访问服务和导航。您可以对尽可能多的帧重复此操作。然后,您可以在不考虑 "where" 框架的情况下处理视图模型中的导航,只是您的逻辑需要它进行导航。
这有意义吗?