PRISM会有所帮助吗?

时间:2020-03-05 18:49:12  来源:igfitidea点击:

我正在考虑使用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"(屏幕导体))来处理显示区域中的屏幕或者隐藏区域,则将更加容易。