维护视图路径的最干净方法



我在项目中使用Modern UI。不幸的是,它的导航机制是基于视图的xaml文件的绝对路径(或相对于项目目录的路径)。

示例窗口xaml

...
<mui:LinkGroup DisplayName="Menu">
    <mui:LinkGroup.Links>
    <mui:Link DisplayName="About"
          Source="/View/Pages/AboutView.xaml"/>
    <mui:Link DisplayName="Settings"
          Source="/View/Pages/SettingsView.xaml"/>
    <mui:Link DisplayName="Gallery"
          Source="/View/Pages/GalleryView.xaml"/>
    </mui:LinkGroup.Links>
</mui:LinkGroup>
...

后面的示例代码

string url = "/View/Pages/AboutView.xaml";
NavigationService nav = NavigationService.GetNavigationService(this);
nav.Navigate(new System.Uri(url, UriKind.RelativeOrAbsolute));

我喜欢重构很多东西,所以我不想依赖到源文件的硬编码路径。我一直在想,一个类似全局字典的结构,将类类型typeof(XyzViewModel)映射到它们各自的路径,也许是一个不错的想法(至少我会把所有东西都放在一个地方),但话说回来,单身汉是邪恶的。我不认为反思也是一个答案。

有没有办法在不诉诸反模式的情况下处理这种情况?

没有太多的重构保存方法。

可以做的一件事是使用一个带有常量的类,该类包含所有路径。

namespace MyApp.Shared 
{
    public static class NavigationConstants
    {
        public const string About = "/View/Page/AboutView.xaml";
    }
}

然后在代码隐藏中使用它,而不是魔术串:nav.Navigate(new System.Uri(NavigationConstants.About, UriKind.RelativeOrAbsolute));

它不是单例模式,也不会阻碍去耦或单元测试。

在XAML端,可以使用Static关键字来映射路径。

   xmlns:shared="clr-namespace:MyApp.Shared"
...
<mui:LinkGroup DisplayName="Menu">
    <mui:LinkGroup.Links>
        <mui:Link DisplayName="About"
            Source="{x:Static shared:NavigationConstants.About}"/>
        <mui:Link DisplayName="Settings"
            Source="{x:Static shared:NavigationConstants.Settings}"/>
        <mui:Link DisplayName="Gallery"
            Source="{x:Static shared:NavigationConstants.Gallery}"/>
    </mui:LinkGroup.Links>
</mui:LinkGroup>

最新更新