2011-05-23 79 views
0

我试图实现模块化并且有一些复杂性。我实现了一个名为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

我不太清楚Silverlight中的工作原理,但我认为这是对Prism的误解。

棱镜是基于地区。这意味着应用程序用户界面由ContentControls(或其他支持区域的控件)组成,这些控件声明为区域。区域管理器现在将所有想要驻留在特定区域内的视图添加到该区域中。

模块只需要告诉其内部区域的特定模块中实现的观点希望居住的区域经理:

RegionManager.RegisterViewWithRegion("RegionName", typeof(View)); 

如果特定区域目前还没有用户界面的一部分,这是因为包含主持该区域的控件不是用户界面本身的一部分的视图,则想要在该区域内重新播放的视图不能放置在该区域内。区域经理只是不知道该地区。要显示视图,您必须手动将用于托管区域的控件添加到用户界面。

另一种方法是手动添加特定区域到区域。使用这种方法,您不必将视图注册到区域经理。所以当区域经理发现该区域保持空白时。如果您希望将意见纳入取决于你必须手动添加到区域中的任何状态或用户操作的区域

IRegion region = RegionManager.Regions["RegionName"]; 
region.Add(new View(), "ViewName"); 

:现在,您可以手动添加视图到使用区域管理的区域。看看股票交易者参考实施。它以一种非常简单的方式解释了如何将视图添加到由用户操作触发的区域。

+0

我明白你的意思,我也检查了股票交易实施。但是,在这个实现模块中,当可用模块被加载并且模块的视图之一被注册到主视图时。即使我使用区域,我需要在入口处注册我的视图,其中包含在模块旁边的初始化方法,因为此方法调用一次。 – slatch 2011-05-23 09:17:40

+0

在我的场景中,我在主视图顶部有按钮,这些按钮不是模块的一部分。当我点击按钮时,我想要加载模块并显示视图。直到这里没有问题。但是,当我再次单击按钮时,我无法再显示我的视图,因为初始化方法调用了一次。我需要按需加载模块并多次进入其内部。 – slatch 2011-05-23 09:17:50

+0

您不必多次初始化您的模块,因为它们已经被初始化。你只需要多次添加你的视图到一个区域。 – PVitt 2011-05-23 09:20:44