我正在开发一个具有以下结构的WPF PRISM应用程序(我已经简化了更好的解释,没有额外的层)。我使用Unity作为我的DI / IOC
在Gui,我的观点名称如下:
我在shell中有三个区域。 MainRegion - 主要内容 TopRegion - 导航菜单 BottomRegion - 状态栏
我使用以下方法向区域注册视图
IRegion region = _regionManger.Regions[RegionNames.MainRegion];
var mainView = _container.Resolve<Home>();
region.Add(mainView, ViewNames.HomeViewName);
region.Activate(mainView);
第一次激活发生在Top,Main和Bottom的模块初始化方法中。
在此之后,我会在单击按钮时激活其他视图。它现在只是代码背后的代码。示例代码:
IRegion region = _regionManger.Regions[RegionNames.MainRegion];
var reportView = region.GetView(ViewNames.ReportsViewName);
if (reportView == null)
{
reportView = _container.Resolve<ReportsView>();
region.Add(reportView, ViewNames.ReportsViewName);
region.Activate(reportView);
}
else
{
region.RequestNavigate(ViewNames.ReportsViewName);
}
问题1 :关于如何做到这一点或我正在做的事情的任何建议都很好。 顶部菜单包含Home,Employees,Orders,Reports按钮。
在主页中,我最近在datagrid中将员工的订单作为readonly。 我想双击导航到OrderView并传递所选订单以显示给用户。 问题2 我不知道在哪里进行导航。
问题3:另一个问题是如果设置RegionMemberLifeTime keepAlive为false,则不会触发INavigationAware方法。如果我没有将KeepAlive设置为false,则页面不会刷新,因为视图模型不会被调用。
我需要在导航到页面时刷新页面并且不会过时,并且当视图导航到用户时也会处理任何确认提示。
非常感谢您的帮助。
答案 0 :(得分:1)
这肯定为时已晚......但
问题1/2:在模块初始化程序中向区域添加内容是否有特殊原因? 常见的方式更像是 - &gt;在xaml:
<ContentControl prism:RegionManager.RegionName="MainRegion" />
并在ModuleInit.cs中 - &gt;初始化()
_regionManager.RegisterViewWithRegion("MainRegion", () => _container.Resolve<MainView>());
问题3: 视图必须实现INavigationAware,IRegionMemberLifetime 和swich区域一样,在viewModel中你可以:
_regionManager.RequestNavigate("RegionWhatever", new Uri("TestView", UriKind.Relative));
但是要工作,你必须在ModulInit.cs中将它作为一个具有viewName的对象注册,如下所示:
_container.RegisterType<Object, TestView>("TestView");
和具有正确RegionName的contentControl当然在xaml中定义