我正在使用MVVM + Prism开发WPF应用程序。 Shell分为两个区域:Menu + MainScreenArea。
菜单包括导航:搜索实体,添加实体,编辑实体。基本上mainScreenArea应该加载相应的模块/ View。如果在菜单区域中选择了搜索实体,则mainScreenArea应显示SearchEntity模块/视图。
我仍然没有编码,但我想我会为每个目的创建一个模块:SearchEntityModule,AddEntityModule等。
然后,MainWorkArea将根据菜单区域的相应点击按需更改模块。
现在,如何更改MainScreenArea区域中的模块?我应该从MenuRegion将nameOfModule加载到eventAggregator,而MainScreenArea是否会从聚合器中获取屏幕名称?
无论如何,我是新手,所以如果我走错方向,请将你的建议发给我。谢谢!
答案 0 :(得分:0)
棱镜文档有关于导航的整个部分。这个问题的问题在于按需加载模块时有许多不同的方法。我发布了一个链接,希望能引导您朝着正确的方向前进。如果是,请将此标记为已回答。谢谢
http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx
答案 1 :(得分:0)
如前所述,有许多方法可以实现这一点。对于我的情况,我有一个类似的shell
,它有一个导航区域和一个主区域,我的功能分为许多模块。我的模块都将自己的导航视图添加到该导航区域(在模块add
的初始化中,他们自己的导航视图到导航区域)。通过这种方式,我的shell不知道各个模块及它们可能暴露的命令。
单击命令时,它所属的导航视图模型执行如下操作:
/// <summary>
/// switch to the view given as string parameter
/// </summary>
/// <param name="screenUri"></param>
private void NavigateToView(string screenUri)
{
// if there is no MainRegion then something is very wrong
if (this.regionManager.Regions.ContainsRegionWithName(RegionName.MainRegion))
{
// see if this view is already loaded into the region
var view = this.regionManager.Regions[RegionName.MainRegion].GetView(screenUri);
if (view == null)
{
// if not then load it now
switch (screenUri)
{
case "DriverStatsView":
this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<IDriverStatsViewModel>().View, screenUri);
break;
case "TeamStatsView":
this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<ITeamStatsViewModel>().View, screenUri);
break;
case "EngineStatsView":
this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<IEngineStatsViewModel>().View, screenUri);
break;
default:
throw new Exception(string.Format("Unknown screenUri: {0}", screenUri));
}
// and retrieve it into our view variable
view = this.regionManager.Regions[RegionName.MainRegion].GetView(screenUri);
}
// make the view the active view
this.regionManager.Regions[RegionName.MainRegion].Activate(view);
}
}
所以基本上该模块有3个可能的视图可以放入MainView,关键步骤是将它添加到区域并使其处于活动状态。