Silverlight PRISM,显示/隐藏模块问题

时间:2009-09-23 10:32:36

标签: silverlight events module prism

我使用PRISM框架创建了一个项目。我有一些模块,我可以在shell中注册和显示,这很好。我需要做的是在从事件聚合器收到特定事件时动态显示和隐藏模块。

我触发应该接收的DisplayModule事件并隐藏现有模块并显示一个新模块,但我的问题是我应该在哪里接收此事件并显示模块?贝壳?如果是这样,我将如何做到这一点,因为shell是顶级的,似乎不会继承所需的Unity方法。

我还以为我可以有一个单独的模块来监听DisplayModule事件,并使用区域管理器隐藏上一个模块并显示新模块。这需要引用所有其他模块才能解析它们的类型,这是不好的做法吗?

希望这是有道理的。

谢谢你的时间

2 个答案:

答案 0 :(得分:4)

但是,您无法卸载整个模块。您可以动态加载一个,但不能卸载一个。有关更多信息,请阅读以下文章中的按需加载模块http://msdn.microsoft.com/en-us/library/dd458911.aspx

假设:我将首先假设当您说要卸载模块时,您实际上只是希望从您的应用程序中删除所有视图。

首先,我们来谈谈您的模块如何工作以及它们如何在您的shell上显示其内容。

您的shell将有一个或多个区域,模块可以在初始化时注册视图。

public MyFirstModule : IModule
{
     IRegionManager _mgr;
     public MyFirstModule(IRegionManager mgr)
     {
          _mgr = mgr;
     }

     public void Initialize()
     {
          _mgr.RegisterViewWithRegion("MainRegion", typeof(MyView));
     }

}

可以做的是更改模块初始化以跟踪已在此模块中注册的视图,并在适当时卸载它们。

public MyFirstModule : IModule
{
     IRegionManager _mgr;
     IEventAggregator _agg;
     IUnityContainer _container;
     public MyFirstModule(IRegionManager mgr, 
                          IEventAggregator agg, 
                          IUnityContainer container)
     {
          _mgr = mgr;
          _agg = agg;
          _container = container;
     }

     List<object> Views = new List<object>();
     public void Initialize()
     {
          _mgr.RegisterViewWithRegion("MainRegion", () =
          {
               MyView view = _container.Resolve<MyView>();

               //Track this view so I can remove it if needed
               Views.Add(view);
               return view;
          });

          _agg.GetEvent<UnloadModuleRequest>.Subscribe(RemoveViews,                
                                                       ThreadOptions.UIThread);
     }

     private void RemoveViews(string moduleToUnload)
     {
          //If this is true, that means the Shell is asking
          //me to unload, so I will remove any views I've
          //registered from any regions they were registered to
          if(moduleToUnload == "MyFirstModule")
          {
               foreach(object view in Views)
               {
                    _mgr.Regions["MainRegion"].Remove(view);
               }
          }

     }

}

通过这种方式,您的Shell可以发布名为UnloadModuleRequest(类型为CompositePresentationEvent<string>)的事件,并让任何模块监听卸载它已注册的任何视图。

我希望这接近你想要的。

答案 1 :(得分:2)

以下主题处理类似情况并解释实现目标的可能方法:

如果有帮助,请告诉我。

Damian Schenkelman http://blogs.southworks.net/dschenkelman