导航拓扑概述

本概述介绍 WPF 中的导航拓扑。 随后将讨论三个常见的导航拓扑,其中包含示例。

注释

阅读本主题之前,应熟悉使用页面函数在 WPF 中结构化导航的概念。 有关这两个主题的详细信息,请参阅 结构化导航概述

本主题包含以下部分:

在 WPF 中,导航通常由包含超链接(Page)的页面()组成,这些超链接(Hyperlink)在单击时导航到其他页面。 导航到的页面由统一资源标识符(URI)标识(请参阅 WPF 中的包 URI)。 请考虑以下简单示例,其中显示了页面、超链接和统一资源标识符(URI):

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WindowTitle="Page1">
  <Hyperlink NavigateUri="Page2.xaml">Navigate to Page2</Hyperlink>
</Page>
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WindowTitle="Page2">
  <Hyperlink NavigateUri="Page1.xaml">Navigate to Page1</Hyperlink>
</Page>

这些页面排列在 导航拓扑 中,其结构由可在页面之间导航的方式决定。 此特定导航拓扑适用于简单方案,尽管导航可能需要更复杂的拓扑,但其中一些拓扑只能在应用程序运行时定义。

本主题介绍三种常见的导航拓扑: 固定线性拓扑、 固定分层拓扑和 动态生成拓扑。 每种导航拓扑都有一个示例,UI 与下图所示相似。

包含数据项和导航按钮的任务页。

结构化导航拓扑

有两种类型的导航拓扑:

  • 修复了拓扑:在编译时定义,在运行时不会更改。 固定拓扑可用于按线性或分层顺序浏览固定页面序列。

  • 动态拓扑:根据从用户、应用程序或系统收集的输入在运行时定义。 当页面可以在不同的序列中导航时,动态拓扑非常有用。

尽管可以使用页面创建导航拓扑,但示例使用页面函数,因为它们提供了额外的支持,简化了通过拓扑页传递和返回数据的支持。

固定线性拓扑类似于向导的结构,该向导具有一个或多个在固定序列中导航的向导页。 下图显示了具有固定线性拓扑的向导的概要结构和流程。

显示固定线性拓扑的图表。

在固定线性拓扑上导航的典型行为包括:

  • 从调用页导航到启动向导的页面,初始化向导并导航到第一个向导页。 不需要启动器页面(无 PageFunction<T>UI),因为调用页可以直接调用第一个向导页。 但是,使用启动器页可以简化向导初始化,尤其是在初始化很复杂时。

  • 用户可以使用“后退”和“转发”按钮(或超链接)在页面之间导航。

  • 用户可以使用日记在页面之间导航。

  • 用户可以在任何向导页面点击“取消”按钮取消向导。

  • 用户可以通过按“完成”按钮接受最后一个向导页上的向导。

  • 如果取消向导,向导将返回适当的结果,并且不返回任何数据。

  • 如果用户接受向导,向导将返回相应的结果,并返回它收集的数据。

  • 向导完成后(已接受或取消),向导包含的页面将从日记中删除。 这会使向导的每个实例保持隔离,从而避免潜在的数据或状态异常。

固定分层拓扑的动态导航

在某些应用程序中,页面允许导航到两个或多个其他页面,如下图所示:

显示页面可以导航至多个页面的图示。

此结构称为固定层次结构拓扑,层次结构遍历的顺序通常由应用程序或用户确定在运行时。 在运行时,层次结构中允许导航到两个或多个其他页面的页面收集确定要导航到哪个页面所需的数据。 下图演示了基于上图的几种可能的导航序列之一:

可能的导航序列图示。

即便固定分层结构中的页面顺序是在运行时确定,用户体验仍然与固定线性拓扑的用户体验相同:

  • 从调用页导航到启动向导的页面,初始化向导并导航到第一个向导页。 不需要启动器页面(无 PageFunction<T>UI),因为调用页可以直接调用第一个向导页。 但是,使用启动器页可以简化向导初始化,尤其是在初始化很复杂时。

  • 用户可以使用“后退”和“转发”按钮(或超链接)在页面之间导航。

  • 用户可以使用日记在页面之间导航。

  • 如果用户在日志中导航回去,则可以更改导航序列。

  • 用户可以在任何向导页面点击“取消”按钮取消向导。

  • 用户可以通过按“完成”按钮接受最后一个向导页上的向导。

  • 如果取消向导,向导将返回适当的结果,并且不返回任何数据。

  • 如果用户接受向导,向导将返回相应的结果,并返回它收集的数据。

  • 向导完成后(已接受或取消),向导包含的页面将从日记中删除。 这会使向导的每个实例保持隔离,从而避免潜在的数据或状态异常。

在某些应用程序中,只能在运行时确定两个或多个页面的导航顺序,无论是由用户、应用程序还是外部数据。 下图演示了一组具有不确定导航序列的页面:

一组具有不确定导航序列的页面。

下图演示了用户在运行时选择的导航序列:

显示运行时选择的导航序列的图表。

导航序列称为动态生成的拓扑。 对于用户,与其他导航拓扑一样,用户体验与之前拓扑相同:

  • 从调用页导航到启动向导的页面,初始化向导并导航到第一个向导页。 不需要启动器页面(无 PageFunction<T>UI),因为调用页可以直接调用第一个向导页。 但是,使用启动器页可以简化向导初始化,尤其是在初始化很复杂时。

  • 用户可以使用“后退”和“转发”按钮(或超链接)在页面之间导航。

  • 用户可以使用日记在页面之间导航。

  • 用户可以在任何向导页面点击“取消”按钮取消向导。

  • 用户可以通过按“完成”按钮接受最后一个向导页上的向导。

  • 如果取消向导,向导将返回适当的结果,并且不返回任何数据。

  • 如果用户接受向导,向导将返回相应的结果,并返回它收集的数据。

  • 向导完成后(已接受或取消),向导包含的页面将从日记中删除。 这会使向导的每个实例保持隔离,从而避免潜在的数据或状态异常。

另请参阅