问题描述
|
我正在尝试实现模块化并带来一些麻烦。我实现了一个名为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();
}
这样,就不需要加载模块了。
有没有一种方法可以按需从模块中加载模块并多次显示视图?
解决方法
我不太确定这在Silverlight中是如何工作的,但是我认为对Prism有误解。
棱镜基于区域。这意味着应用程序用户界面由声明为区域的ContentControl(或其他具有区域功能的控件)组成。现在,区域管理器将要驻留在特定区域内的所有视图添加到该区域中。
这些模块只需要告诉区域管理员将特定模块中实现的视图驻留在哪个区域中即可:
RegionManager.RegisterViewWithRegion( \"RegionName\",typeof( View ) );
如果特定区域当前不是用户界面的一部分,则因为包含承载该区域的控件的视图不是用户界面本身的一部分,因此想要驻留在该区域内部的视图不能放置在该界面内部区域。区域经理只是不知道该区域。要显示视图,您必须手动将承载区域的控件添加到用户界面。
另一种方法是手动将特定内容添加到区域中。使用这种方法,您不必将视图注册到区域管理器。因此,当区域经理发现该区域时,它将保持为空。现在,您可以使用区域管理器将视图手动添加到区域中:
IRegion region = RegionManager.Regions[\"RegionName\"];
region.Add( new View(),\"ViewName\" );
如果要根据任何状态或用户操作将视图放置到区域中,则必须手动将视图添加到该区域中。看看股票交易者参考补充。它以一种非常简单的方式说明了如何将视图添加到由用户操作触发的区域。