Поможет ли ПРИЗМА?

#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 ) для обработки ваших экранов при отображении или скрытии из регионов.