Я создал проект, используя структуру PRISM. У меня есть несколько модулей, которые я могу зарегистрировать и отобразить в оболочке, и это отлично работает. Что мне нужно сделать, так это динамически отображать и скрывать модули, когда конкретное событие получено от агрегатора событий.
Я запускаю событие DisplayModule, которое должно быть получено, и скрываю существующий модуль, и показываю новый, но мой вопрос: где я должен получить это событие и отобразить модуль? оболочка? если да, то как мне это сделать, поскольку оболочка является верхним уровнем и, похоже, не наследует необходимые методы Unity.
Я также подумал, что мог бы иметь отдельный модуль, который прослушивал бы событие DisplayModule и использовал диспетчер регионов, чтобы скрыть предыдущий модуль и показать новый. Это должно было бы ссылаться на все другие модули, чтобы иметь возможность разрешить их тип, хотя это плохая практика?
Надеюсь, это имеет смысл.
Спасибо за уделенное время
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>
) и заставить любой прослушивающий модуль выгрузить все зарегистрированные представления.
Я надеюсь, что это близко к тому, что вы хотите.
Следующие темы посвящены подобным ситуациям и объясняют возможные способы достижения ваших целей:
- Вручную загрузить модуль http://compositewpf.codeplex.com/Thread/View.aspx ?ThreadId=62400
- Подтверждение понимания http://compositewpf.codeplex.com/Thread/View.aspx ?ThreadId=59827
- Загрузить модуль внутри модуля и в целом обсуждение дизайна http://compositewpf.codeplex.com/Thread/View.aspx? ThreadId=59827
Пожалуйста, дайте мне знать, если это поможет.
Дамиан Шенкельман http://blogs.southworks.net/dschenkelman
Похожие вопросы
Новые вопросы
silverlight
Silverlight - кросс-браузерный, кроссплатформенный плагин Microsoft для работы со СМИ и многофункциональных интерактивных приложений.