强类型绝对导航

Strongly type absolute navigation

我正在使用带有 Xamarin 表单的棱镜。

是否可以在使用强类型导航时指定绝对导航?

我知道如何使用 uri 导航来做到这一点,但更愿意远离魔法字符串。

编辑:

这个问题可能措辞不当。我想知道在使用视图模型导航时是否可以使用绝对导航(重置导航堆栈)。我已经确认这是不可能的,也没有导航到导航页面中的页面。

https://github.com/PrismLibrary/Prism/issues/673#issuecomment-229564694

从那以后,我改用像接受的答案一样使用 uri 构建器系统的页面导航。

绝对 URI 是一个字符串。所以你最好的选择是定义一个常量并使用它。

正如 Brian 所说,绝对 URI 是一个字符串。

像他解释的那样定义常量可能是你最好的选择。

对于简单的页面导航(不做多个,只是 "Go here"),您可以使用 nameof(ClassType) 来获取 URI 版本,或者您可以进一步使用 nameof() 并创建一个提供者根据类类型数组生成魔法字符串。

例如,

_navigation.Navigate(_navigation.CreateURI(nameof(HomePage), nameof(LoginPage), nameof(HelpPage)));

其中 CreateURI 是您创建的 NavigationService 的扩展方法,它接收类型为 Page/ContentPage 的参数列表。这最终会阻止您使用魔术字符串(保持重构安全),而无需为每个实例创建一个单独的常量。

它可能看起来像这样(已测试并有效):

public static class PrismExtensionMethods {
    public static string CreateURI(this INavigationService @this, params string[] pages) {
        var result = "";
        foreach(var item in pages) {
            result += item + "/";
        }
        return result;
    }
}

我们将枚举的 ToString 用作 'constants'。枚举包含所有可能的导航选项。注册页面:

_container.RegisterTypeForNavigation<MainPage>(UiExperience.Main.ToString());

导航到页面:

NavigationService.Navigate($"{UiExperience.Main}");

NavigationService.Navigate($"{UiExperience.Main}/{UiExperience.DetailsNavigation}/{UiExperience.WorkOrderOverview}"

这就像杰瑞·尼克松建议的那样 here