我正在尝试实现模块化并且有一些复杂性。我实现了一个名为ModuleA的模块,它在初始化函数中显示了新的childWindow;
public ModuleA()
{
personViewModel = new PersonViewModel();
detail = new ViewDetail(personViewModel);
}
public void Initialize()
{
detail.Show();
}
我的问题是由于缺少重装功能的机会,我无法再次显示视图。我的模块按需加载,我的意思是我想在用户点击按钮时加载模块,所以我没有机会在开始时加载模块并从自己的事件中控制其功能。然后我试图从我的应用程序中显示这样的视图;
private void ButtonModelA_Click(object sender, RoutedEventArgs e)
{
this.moduleManager.LoadModule(MyBootstrapper.ModuleAName);
ChildWindow detail = new ModuleA.ViewDetail(new ModuleA.ViewModel.PersonViewModel());
detail.Show();
}
以这种方式,加载模块变得不必要了。
有没有办法从按需加载模块并多次显示其视图?
答案 0 :(得分:0)
我不太确定它在Silverlight中是如何工作的,但我认为对Prism存在误解。
Prism以地区为基础。这意味着应用程序用户界面包含状态为区域的ContentControls(或其他可控制区域的控件)。区域管理器现在将所有想要驻留在特定区域内的视图添加到该区域中。
模块只需要告诉区域管理器在特定模块中实现的视图要驻留在哪个区域内:
RegionManager.RegisterViewWithRegion( "RegionName", typeof( View ) );
如果特定区域当前不是用户界面的一部分,因为包含托管该区域的控件的视图不是用户界面本身的一部分,因此无法放置要在区域内重置的视图在这个地区内。区域经理只是不知道该地区。要显示视图,您必须手动将托管该区域的控件添加到用户界面。
另一种方法是手动将特定区域添加到区域中。使用此方法,您无需将视图注册到区域管理器。因此,当区域经理发现该区域时,它会保持空白。现在,您可以使用区域管理器手动将视图添加到区域中:
IRegion region = RegionManager.Regions["RegionName"];
region.Add( new View(), "ViewName" );
如果要根据任何状态或用户操作将视图放入区域,则必须手动将其添加到区域中。看看Stock Trader Reference Inplementation。它以非常简单的方式解释了如何向用户操作触发的区域添加视图。