最干净的方式来维护视图';路径
本文关键字:视图 路径 维护 方式 | 更新日期: 2023-09-27 18:27:51
我在项目中使用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>