我在项目中使用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)
映射到它们各自的路径是一个很好的想法(至少我把所有东西放在一个地方),但是又一次,singletons are evil。我不认为反思也是一个答案。
有没有办法处理这种情况而不诉诸反模式?
答案 0 :(得分:1)
没有很多重构方法可以做到这一点。
您可以做的一件事是使用一个包含所有路径的常量类。
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>