PRISM会有所帮助吗?
我正在考虑使用PRISM(WPF综合指南/库)构建应用程序。应用程序模块将被垂直划分(即客户,供应商,销售订单等)。这仍然相对容易...我也有一个带有主要区域的外壳,所有工作都会进行,但是现在我需要以下行为:我需要在主外壳上有一个菜单,并且单击每个选项时(例如客户,供应商等),我需要找到该模块并将其加载到该区域中(一次仅1个视图)?
有人知道任何具有此类行为的示例应用程序吗?所有示例都更加着重于将所有模块加载到主外壳上吗?我的菜单栏也应该是一个模块吗?
[更新]如何根据从菜单中选择的模块将其注入到区域中?所有示例都表明该模块在初始化时将视图注入到该区域中。如果在菜单上选择了模块,我只需要注入视图?
解决方案
回答
目前尚不清楚我们说的是"查找模块并将其加载到区域中"的意思。我们可以加载模块的视图并将其添加到外壳中。 Composite UI应用程序块和CompositeWPF构建在IoC模式的顶部。这意味着模块应将其菜单项注入外壳程序的菜单栏中,或者订阅由外壳程序生成的事件。
回答
我们可以将主要区域设置为ContentControl,这样一次只能激活1个视图。
我们也可以"按需"加载模块。有一个快速入门,向我们显示如何执行此操作。我们还应该记住,如果模块已经初始化过一次,则对其进行第二次初始化将不会在模块上执行Initialize()方法。
单击菜单时,这将很有用,这将按需加载模块(尚未加载视图),然后可以通过EventAggregator触发事件,因此模块现在可以添加视图(使用不添加视图twrice的方法)和激活视图(这将确保该视图在该区域显示)。
希望这可以帮助,
朱利安
回答
刚刚在dnrTV上观看了Prism上的Brian Noyes。这回答了我所有的问题...
回答
是的,PRISM将在这里为我们提供帮助。
这里有很多事情值得一提。
RE: Is Prism right for me?
我们可以按需加载模块。 PRISM具有在运行时加载模块的功能,因此,如果我们使用Shell和ModuleA来启动上述解决方案,则可以使用。然后,用户触发一个事件(即,菜单选项),它可以允许我们动态加载ModuleB,然后将其注入游戏。不过要明确一点,我们确实需要在这里坐下来做作业,因为我们需要确保ModuleB对其他模块等没有任何依赖(通常使用基础结构模块是明智的。在这里,我有一个模块清单,可以在XML中查找列出其绝对依赖项的模块,然后确保先加载它们,然后再加载ModuleB。
请参阅通过PRISM帮助文档按需加载模块(开发活动)。同时查找准备用于远程下载的模块
RE: Injecting a view at runtime
通过菜单将视图注入到区域中是访问IRegionManager并将其添加的简单情况。为此,请在构造函数中确保我们正在使用put的上述ViewModel / Presenter / Controller:
MyConstructor(IRegionManager regionManager, IUnityContainer container)
与PRISM一样,我们几乎可以将所需的任何对象添加到构造中,并且PRISM将确保它按时且按预算到达(呵呵)。
从那里开始,我们通常会采用添加视图的方法...例如:
IMyViewInstance myViewInstance = this.container.Resolve<IMyViewInstance>(); IRegion myRegion = this.regionManager.Regions["YourRegion"]; myRegion.add(myViewInstance); myRegion.Active(myViewInstance);
所有人都应该在一起! :)
笔记:
- 确保在Construct中设置对容器和regionManager的本地引用(this.container = container等)。
- 如果不确定上述命名空间在哪里,请右键单击例如IUnityContainer,然后让Visual Studio解析它(右键单击菜单)。
- 将添加逻辑放入菜单事件中,或者使用集中式方法-以反击方式为准:)
Scott Barnes Rich Platforms产品经理Microsoft。
回答
为了节省时间,请查看John Papa的Presentation Framework文章。如果我们有第三个对象(" Screen Conductor"(屏幕导体))来处理显示区域中的屏幕或者隐藏区域,则将更加容易。