Поможет ли PRISM?
Я рассматриваю возможность создания приложения с использованием PRISM (Composite WPF Guidance/Library). Модули приложения будут разделены по вертикали (т. Е. Клиенты, поставщики, заказы на продажу и т. Д.). Это все еще относительно легко... У меня также есть оболочка с основным регионом, где вся работа будет происходить, но теперь мне нужно следующее поведение: мне нужно меню в моей основной оболочке и при нажатии на каждый из параметров (как клиенты, поставщики и т. д.) Мне нужно найти модуль и загрузить его в регион (только 1 просмотр за раз)?
Кто-нибудь знает примеры приложений с таким типом поведения? Все примеры более сфокусированы на загрузке всех модулей на основную оболочку? И должна ли моя строка меню быть модулем?
[ОБНОВЛЕНИЕ] Как добавить модуль в область на основе его выбора из меню? Все примеры показывают, что модуль вводит представление в регион при инициализации? Мне нужно только внедрить вид, если модуль выбран в меню?
5 ответов
Да, PRISM поможет вам здесь.
Здесь стоит упомянуть ряд вещей.
RE: Призма подходит мне?
Вы можете загрузить модуль по требованию. PRISM имеет возможность загрузки модуля в RunTime, так что в вашем случае, если вы загрузите указанное решение, используя Shell и ModuleA. Затем ваш пользователь запускает событие (т. Е. Выбор из меню), после чего он может позволить вам динамически загружать ModuleB и затем вводить его в игру. Чтобы быть ясным, вам действительно нужно сесть и сделать свою домашнюю работу здесь, поскольку вы должны убедиться, что ModuleB не имеет своих собственных зависимостей от других модулей и т. Д. (Как правило, разумно использовать модуль инфраструктуры. Я использовал методы где у меня есть манифест модулей, которые я ищу в XML, в котором перечислены его абсолютные зависимости, а затем я сначала проверяю, загружены ли они, а затем загружаю ModuleB).
См. Загрузка модулей по требованию через справочные документы PRISM (Деятельность по разработке). Также ищите Подготовить модуль для удаленной загрузки
RE: внедрение представления во время выполнения
Внедрить вид в регион через меню - это простой случай доступа к IRegionManager и его добавления. Чтобы сделать это, убедитесь, что в вашем Конструкторе для указанной ViewModel/Presenter/Controller вы используете put:
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);
И все должно собраться вместе!:)
Замечания:
- Убедитесь, что вы установили локальную ссылку на контейнер и regionManager в Construct (this.container = container и т. Д.).
- Если вы не уверены, где существуют указанные выше пространства имен, щелкните правой кнопкой мыши IUnityContainer, например, и позвольте Visual Studio РАЗРЕШИТЬ его (меню правой кнопки мыши).
- Поместите логику "Добавить" в "Событие меню" или используйте центральный метод - в зависимости от того, что унесет ваши волосы назад:)
Скотт Барнс - менеджер по продуктам Rich Platforms - Microsoft.
Только что закончил смотреть Брайана Нойса на Prism на dnrTV. Это ответило на все мои вопросы...
Непонятно, что вы имеете в виду, говоря "найдите модуль и загрузите его в регион". Вы можете загрузить вид модуля и добавить его в оболочку. Блок приложения Composite UI и CompositeWPF строятся поверх шаблона IoC. Это означает, что ваши модули должны вставлять свои пункты меню в полосу меню оболочки или подписываться на события, генерируемые оболочкой.
Вы можете сделать свой основной регион ContentControl, таким образом, только 1 представление будет активным одновременно. Вы также можете загрузить свои модули "по требованию". Существует быстрый старт, который показывает вам, как это сделать. Следует также иметь в виду, что, если модуль уже был инициализирован один раз, его повторная инициализация не будет выполнять метод Initialize() для модуля. Может быть полезно, что при нажатии на меню это будет загружать модуль по требованию (который еще не загрузит представление), а затем вы можете запустить событие через EventAggregator, чтобы модуль теперь мог добавить представление (использовать именованные подход не добавлять вид дважды) и активировать вид (который обеспечит просмотр вида в регионе).
Надеюсь, это поможет, Джулиан
Чтобы сэкономить ваше время, ознакомьтесь со статьей "Структура представления" Джона Папы. Это будет проще, если у вас есть 3-й объект (Screen Conductor
) обрабатывать ваши экраны в показе или скрытии от регионов.