开发 Uri 导航
开发 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 处理程序上。