开发 Uri 导航
开发 Uri 导航
相关信息
本文章主要讲述开发人员如何注册自定义的 Uri 导航。如果您想了解应用内置的 Uri 导航路径,请参阅。
ClassIsland 支持通过 Uri 进行应用内导航,同时也支持注册系统 Url 协议,从应用外部打开特定的 Uri。
本文将介绍如何通过 UriNavigationService 来注册您自定义的 Uri 和导航事件处理方法来处理导航,以及如何在 UI 上通过命令和直接调用导航服务进行导航。
ClassIsland 的 Uri 导航协议是 classisland://。
注册导航
要注册导航,您首先需要获取服务 ClassIsland.Core.Abstractions.Services.IUriNavigationService。获取服务的详细方法见。
相关信息
在本文的代码中,我们假定将获取到的服务存储在了属性 UriNavigationService 中。
接下来我们注册路径 foo/bar 的处理程序:
UriNavigationService.HandlePluginsNavigation(
"foo/bar",
args => {
CommonDialog.ShowInfo($"Hello world! {args.Uri}");
}
);在上面的代码中,我们使用 HandlePluginsNavigation 方法注册了处理导航到路径 foo/bar 的处理程序。当导航到这个 Uri classisland://plugins/foo/bar 时,会运行传入的处理程序,显示对话框。在事件处理程序中可以通过参数 args 获取原始导航的 Uri 和原始 Uri 相对当前注册的路径的子路径。
使用 HandlePluginsNavigation 方法注册的 Uri 的主机是 plugins,也就是专门为插件预留的导航主机。如果要注册到 app 或其他主机下,请使用 HandleAppNavigation 方法。
注
HandleAppNavigation等方法具有 internal 保护,只有从 ClassIsland 内部才能注册到 app 和自定义主机下。插件中只能使用 HandlePluginsNavigation 方法注册到 plugins 主机下。
导航
在导航到某个 Uri 时,ClassIsland 会首先尝试导航到指定的路径下。如果这个路径下没有注册处理方法,会逐步向上级导航,直到根目录。
举个栗子
假设我们注册到了路径 hello_world/hello_world。当向 hello_world/hello_world/foo_bar 导航时,由于这个路径还未被注册,会导航到上一级 hello_world/hello_world,并触发对应的事件处理程序。
以下有几种进行导航的方式:
通过 NavHyperlink
NavHyperlink 继承于 Hyerlink,具有后者类似的外观与体验,可以插入到 TextBlock 或 FlowDocument 等中,实现 Uri 导航。
要使用 NavHyperlink 导航,需要将 NavigateTarget 属性设置为要导航到的 Uri,例如:
<TextBlock>
<ci:NavHyperlink NavigateTarget="https://cn.bing.com">Test link 1</ci:NavHyperlink>
<ci:NavHyperlink NavigateTarget="classisland://app/test">Test link 2</ci:NavHyperlink>
</TextBlock>通过代码导航
调用 IUriNavigationService.Navigate 方法可以导航到指定的 Uri。如果要导航的 Uri 协议不是 classisland://,ClassIsland 会自动调用系统中最合适的应用处理这个 Uri。
// 打开导航测试窗口
UriNavigationService.Navigate(new Uri("classisland://app/test"));
// 在系统浏览器中打开 ClassIsland 官网
UriNavigationService.Navigate(new Uri("https://classisland.tech"));从外部调用
如果 ClassIsland 在系统上注册了 classisland:// 链接的打开方式,那么在浏览器等地方打开这种协议的链接时,ClassIsland 可以在应用中导航到对应的 Uri 处理程序上。