Silverlight PRISM, отображение/скрытие модулей вопрос

Я создал проект, используя структуру PRISM. У меня есть несколько модулей, которые я могу зарегистрировать и отобразить в оболочке, и это отлично работает. Что мне нужно сделать, так это динамически отображать и скрывать модули, когда конкретное событие получено от агрегатора событий.

Я запускаю событие DisplayModule, которое должно быть получено, и скрываю существующий модуль, и показываю новый, но мой вопрос: где я должен получить это событие и отобразить модуль? оболочка? если да, то как мне это сделать, поскольку оболочка является верхним уровнем и, похоже, не наследует необходимые методы Unity.

Я также подумал, что мог бы иметь отдельный модуль, который прослушивал бы событие DisplayModule и использовал диспетчер регионов, чтобы скрыть предыдущий модуль и показать новый. Это должно было бы ссылаться на все другие модули, чтобы иметь возможность разрешить их тип, хотя это плохая практика?

Надеюсь, это имеет смысл.

Спасибо за уделенное время


person Community    schedule 23.09.2009    source источник


Ответы (2)


Однако вы не можете выгрузить весь модуль. Вы можете динамически загружать один, но не выгружать его. Дополнительные сведения см. в разделе Загрузка модулей по запросу в следующей статье: http://msdn.microsoft.com/en-us/library/dd458911.aspx

Предположение: я начну с предположения, что когда вы говорите, что хотите выгрузить модуль, вы просто хотите, чтобы все его представления были удалены из вашего приложения.

Прежде всего, давайте поговорим о том, как работают ваши модули и как они отображают свое содержимое в вашей оболочке.

В вашей оболочке будет один или несколько регионов, в которых ваши модули смогут зарегистрировать представления при их инициализации.

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);
               }
          }

     }

}

Таким образом, ваша оболочка может опубликовать событие с именем UnloadModuleRequest (типа CompositePresentationEvent<string>) и заставить любой прослушивающий модуль выгрузить все зарегистрированные представления.

Я надеюсь, что это близко к тому, что вы хотите.

person Anderson Imes    schedule 24.09.2009

Следующие темы посвящены подобным ситуациям и объясняют возможные способы достижения ваших целей:

Пожалуйста, дайте мне знать, если это поможет.

Дамиан Шенкельман http://blogs.southworks.net/dschenkelman

person dschenkelman    schedule 24.09.2009
comment
На самом деле ничего не говорится о выгрузке модуля. - person Anderson Imes; 25.09.2009
comment
Тем не менее, первая тема довольно хороша. Некоторые из упомянутых там вещей, скорее всего, появятся при перезагрузке модуля. Возможно, это обсуждение отговорит suiva от того, что он / она пытается сделать, хотя ... похоже, что у ОП есть небольшое непонимание того, что такое модуль, и эта ветка сильно его утюжит. Спасибо за публикацию. - person Anderson Imes; 25.09.2009