#wpf #prism #cal #cag
Вопрос:
Я рассматриваю возможность создания приложения с использованием PRISM (Составное руководство/библиотека WPF). Модули приложений будут разделены по вертикали (т. е. Клиенты, Поставщики, Заказы на продажу и т.д.). Все это по-прежнему относительно просто… У меня также есть оболочка с основным регионом, в котором будет выполняться вся работа, но теперь мне нужно следующее поведение: мне нужно меню в моей основной оболочке, и когда будет нажата каждая из опций (например, клиенты, поставщики и т. Д.) Мне нужно найти модуль и загрузить его в регион (только 1 просмотр за раз)?
Кто-нибудь знает о каких-либо примерах приложений с таким типом поведения? Все образцы больше ориентированы на загрузку всех модулей в основную оболочку? И должна ли моя строка меню также быть модулем?
[ОБНОВЛЕНИЕ] Как внедрить модуль в регион на основе его выбора из меню? Все примеры показывают, что модуль вводит представление в область при инициализации? Мне нужно вводить представление только в том случае, если модуль выбран в меню?
Комментарии:
1. Следует иметь в виду, что PRISM не позволяет выгружать модуль, поэтому, даже если модуль не отображается, он все еще находится в памяти.
Ответ №1:
Да, ПРИЗМА поможет вам здесь.
Здесь есть ряд вещей, о которых стоит упомянуть.
RE: Подходит ли мне призма?
Вы можете загрузить модуль по запросу. PRISM обладает возможностями загрузки модуля во время выполнения, поэтому в вашем случае, если вы загружаете указанное решение с помощью оболочки и ModuleA. Затем ваш пользователь запускает событие (т. Е. Выбор меню), которое затем может позволить вам динамически загружать модуль, а затем вводить его в игру. Однако, чтобы быть ясным, вам действительно нужно сесть и сделать свою домашнюю работу здесь, так как вам нужно убедиться, что ModuleB не имеет каких-либо собственных зависимостей от других модулей и т. Д. (Обычно разумно использовать модуль инфраструктуры. Я использовал методы, в которых у меня есть манифест модулей, которые я ищу в XML, в котором перечислены их абсолютные зависимости, а затем я удостоверяюсь, что они загружены первыми, а затем загружаю ModuleB).
См. раздел Загрузка модулей по требованию через справочные документы PRISM (Деятельность по разработке). Также поиск Подготовьте модуль для удаленной загрузки
RE: Ввод представления во время выполнения
Чтобы ввести представление в регион через меню, достаточно просто получить доступ к IRegionManager и затем добавить его. Для этого убедитесь, что в вашем конструкторе для указанной модели представления/презентатора/контроллера, который вы используете, помещено:
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 при построении (this.container = контейнер и т. Д.).
- Если вы не уверены, где существуют указанные выше пространства имен, например, щелкните правой кнопкой мыши на IUnityContainer и позвольте Visual Studio РАЗРЕШИТЬ его (меню щелчка правой кнопкой мыши)
- Поместите логику добавления в свое событие меню или используйте центральный метод — в зависимости от того, что отбросит ваши волосы назад 🙂
Скотт Барнс — Менеджер по продуктам Rich Platforms — Microsoft.
Ответ №2:
Только что закончил смотреть Брайана Нойеса на Prism на dnrTV. Это ответило на все мои вопросы…
Ответ №3:
Неясно, что вы имеете в виду, говоря «найдите модуль и загрузите его в регион». Вы можете загрузить представление модуля и добавить его в оболочку. Составной блок приложения пользовательского интерфейса и CompositeWPF построены поверх шаблона IoC. Это означает, что ваши модули должны вводить свои пункты меню в полосу меню shell или подписываться на события, генерируемые shell.
Ответ №4:
Вы могли бы сделать так, чтобы ваш основной регион был элементом управления контентом, таким образом, одновременно будет активен только 1 просмотр. Вы также можете загружать свои модули «По требованию». Существует краткое руководство, которое покажет вам, как это сделать. Вы также должны иметь в виду, что если модуль уже был инициализирован один раз, его повторная инициализация не приведет к выполнению метода Initialize() в модуле. Может быть полезно, что при нажатии на меню будет загружен модуль по требованию (который еще не загрузит представление), а затем вы сможете запустить событие через EventAggregator, чтобы модуль теперь мог добавить представление (используйте именованный подход, чтобы не добавлять представление twrice) и Активировать представление (что позволит убедиться, что представление заштриховано в регионе).
Надеюсь, это поможет, Джулиан
Ответ №5:
чтобы сэкономить ваше время, ознакомьтесь со статьей Джона Папы о структуре презентации. Это будет проще, если у вас есть 3rd object( Screen Conductor
) для обработки ваших экранов при отображении или скрытии из регионов.