在wpf开发中,使用prism的一些问题解决
最近,使用prism v8推荐的构建模式,搭建了使用wpf技术的Composite Application。现在总结一下。
一、 在prism中,它在主窗体使用了bootstrapper来初始化模块,引导Unity和Module运行。它这样做有一定的局限性:
l 在主窗体中,各模块的位置都固定,不能满足诸如同一个控件容器按照用户的要求,在运行中注入相应模块的设计需求。如果要求多个模块对应同一个RegionManager.RegionName,在载入模块的时候就会报错,而且,如果将注入的模块设置为InitializationMode.OnDemand,即使在注入的不会报错,但是在程序运行中,将view添加到Region中时,也会出错;
l 在RI的例子中,主窗体是窗体第一个启动的窗体,而实际项目中,第一个启动的往往不是主窗体。所以在第二层窗体中,模块中声明的RegionName就会出现找不到相应的占位RegionName的问题。
现把解决方法写出来,供以后参考:
将程序的第一个程序设置为引导程序,将程序的主程序列为其引导的程序。
{
OCSLoader shell = this.Container.Resolve<OCSLoader>();
shell.Show();
return shell;
}
protected override void InitializeModules()
{
IModule mainFrame = this.Container.Resolve<OCS.MainFrame.MainFrameModule>();
mainFrame.Initialize();
IModule tt = this.Container.Resolve<OCS.Query.QueryModule>();
tt.Initialize();
}
这段代码是bootstrapper中的引导代码,shell为引导程序,负责初始化Castle AR ,Logger和用户登录。并为主窗体提供容器。
InitializeModules函数中的语句是初始化模块,但是和RI中建议的方式不一样。
使用的时候,查询模块要和其他模块公用MainFrameModule中的一个Region,
public object View3
{
get
{
if (null == view3)
{
QueryEditorPresentationModel projectsListPresenter = this.container.Resolve<QueryEditorPresentationModel>();
view3=projectsListPresenter.View;
}
return view3;
}
}
上面的代码中QueryEditorPresentationModel是quey窗体的presenter,
当用户要求注入到公用容器中时,使用下面语句
detailsRegion.RemoveAllOtherControlsFromRegion();
detailsRegion.Add(View3,"789");
这样就满足了上面所示的设计需求。而且,各模块只被创建一次。
二、 prism项目中模块采用的M_V_VM模式,这种模式中,view和presenter的关系通过接口解耦,在模块引导类中,通过container.RegisterType函数注册到prism的container中,自动实例化窗体。这种做法可以很好的做到降低viewer和presenter的耦合,但是在实际的界面编写中,对于界面UIElement的绑定就有一定的困难,由于嵌套层次的问题,可能会找不到要绑定的presenter中的属性。解决这一问题的方法是采用下面的语句:
以上的总结只是将问题提出和问题的解决说明了一下,以后再对其后面的原理说明。