У Prism есть богатый функционал, который доступен с самого начала, и количество документации в интернете увеличилось по сравнению с прошлым годом, поэтому мы решили использовать фреймворк Prism MVVM для нашего тестового проекта. В конце концов, он кажется простым и удобным.
Эта статья предназначена для людей с базовыми знаниями в области программирования на C# для создания приложения WPF в шаблоне MVVM с использованием Visual Studio 2022 Community Edition с .Net Framework 4.6 или выше и C#.
Что такое Prism?
Создание приложения с шаблоном MVVM с использованием Prism освобождает вас от необходимости писать подобный код снова и снова. Это также упрощает создание экранов, которые динамически загружаются и переключаются между различными компонентами пользовательского интерфейса, такими как на рис.1.
рис.1 Изображение приложения для создания с помощью Prism
Вы можете создать динамическую загрузку компонентов пользовательского интерфейса самостоятельно, и вам не нужно изобретать велосипед, если у вас уже есть библиотека с такой функциональностью.
Основные термины Prism
Прежде всего, мы рассмотрим самые основные термины Prism.
Shell(Оболочка)
Оболочка ссылается на окно, в которое должен быть загружен модуль. Например, в приложении Windows Form вы можете представить его как стартовую форму (проект). Его часто называют оболочкой, имея в виду главное окно или запускаемый проект.
Module(Модуль)
Модуль — это функциональный модульный пакет, который может быть независимо разработан, протестирован и распространен по мере необходимости. Многие примеры, включенные в официальный образец, относятся к проекту DLL, который содержит представление(View), загружаемое в оболочку(Shell).
Region(Регион)
Указывает на элемент управления контейнером, в который должно быть загружено представление. Как описано ниже, когда вы указываете RegionName в XAML, он будет управляться и идентифицироваться внутри Prism. Регион может быть указан только в стандарте Prism для ContentControl, но вы также можете указать другие элементы управления.
Bootstrapper (Начальный загрузчик)
Название похоже на библиотеку пользовательского интерфейса, но оно не используется в дизайне, а используется для инициализации различных компонентов и служб Prism. Он используется для выполнения различных инициализаций Prism в одном месте. В Prism 7.1 и более поздних версиях этот термин был признан устаревшим.
Помимо вышеперечисленных, есть и другие необходимые термины, но на данный момент можно запомнить только 4 из них. По мере необходимости мы будем вспоминать о них.
Официальные шаблоны Prism
Отныне мы будем использовать официальные шаблоны Prism, но вам не нужно заранее устанавливать Prism Template Pack. Он будет установлен с помощью [Nuget Package Restore] при открытии каждого проекта. Если вы хотите установить Prism Template Pack , скачайте его по ссылке ниже.
Раньше я не знал о существовании официального образца, поэтому у меня было много проблем с поиском того, что я мог бы сделать с Prism, но официальный образец Prism очень понятный и простой, и содержит 29 отличных образцов, которые упрощают понимание индивидуальных особенностей, которые дает Prism.
Прежде всего, пожалуйста, получите официальный образец Prism с GitHub по ссылке.(Мы не будем показывать вам, как получить исходный код с GitHub здесь) Ниже приведен обзор всех шаблонов.
Примеры, демонстрирующие, как использовать различные функции Prism с WPF. Если вы только начинаете работать с Prism, рекомендуется начать с первого примера и последовательно продвигаться по списку (по порядку). Каждый образец основывается на концепции предыдущего образца.
Тема | Описание |
Загрузчик и оболочка | Создайте базовый загрузчик и оболочку |
Регионы | Создайте регион |
Пользовательский адаптер региона | Создайте пользовательский адаптер региона для StackPanel |
Просмотр обнаружения | Автоматическое внедрение представлений с помощью обнаружения представлений |
Просмотр инъекции | Добавление и удаление представлений вручную с помощью View Injection |
Просмотр активации / деактивации | Вручную активировать и деактивировать представления |
Модули с App.config | Загружайте модули с помощью файла App.config |
Модули с кодом | Загружайте модули с помощью кода |
Модули с каталогом | Загрузка модулей из каталога |
Модули, загруженные вручную | Загружайте модули вручную с помощью IModuleManager |
ViewModelLocator | использование ViewModelLocator |
ViewModelLocator — соглашение об изменении | Измените соглашения об именовании ViewModelLocator |
ViewModelLocator — пользовательские регистрации | Вручную регистрируйте ViewModels для определенных представлений |
Делегировать команду | Используйте DelegateCommand и DelegateCommand<T> |
CompositeCommands | Узнайте, как использовать CompositeCommands для вызова нескольких команд как одной команды |
Команды IActiveAware | Сделайте ваши команды IActiveAware для вызова только активной команды |
Агрегатор событий | Использование IEventAggregator |
Агрегатор событий — фильтровать события | Фильтрация событий при подписке на события |
RegionContext | Передача данных во вложенные области с помощью RegionContext |
Навигация по регионам | Смотрите, как реализовать базовую навигацию по регионам |
Обратный вызов навигации | Получать уведомления по завершении навигации |
Участие в навигации | Узнайте об участии в навигации View и ViewModel с помощью INavigationAware |
Перейдите к существующим представлениям | Управляйте экземплярами просмотра во время навигации |
Передача параметров | Передача параметров из View / ViewModel в другой View / ViewModel |
Подтверждение / отмена навигации | Используйте интерфейс IConfirmNavigationReqest для подтверждения или отмены навигации |
Управление временем жизни представления | Автоматическое удаление представлений из памяти с помощью IRegionMemberLifetime |
Журнал навигации | Узнайте, как использовать журнал навигации |
Интерактивность — InvokeCommandAction | Вызывать команды в ответ на любое событие |
Шаги необходимые для запуска официального шаблона Prism
Сначала откройте решение непосредственно в разделе «14-USINGEVENTAGGREGATOR» в загруженном вами официальном образце. При запуске Visual Studio щелкните правой кнопкой мыши решение в Обозревателе решений и выберите либо «Восстановить пакет NuGet», либо «Управлять пакетами NuGet для решения», чтобы получить необходимые компоненты из NuGet.
рис.2. Восстановление пакета Nuget
Официальный образец конфигурации Prism “14-UsingEventAggregator”
После этого, когда вы создаете и запускаете его, отображается главное окно (shell). Вы также можете запустить описанный выше метод в проектах, отличных от описанного здесь «14-UsingEventAggregator», чтобы устранить ошибку.
На рисунке показана конфигурация решения «14-UsingEventAggregator».
Проект ModuleA
Модуль, содержащий представление, которое будет загружено слева от оболочки.
Проект ModuleB
Модуль, содержащий представление, которое будет загружено справа от оболочки.
Оболочка Prism и точка входа (Prism 8.0)
Точка входа приложения, это файл App.xaml.cs. (Он будет сгенерирован автоматически)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : PrismApplication { protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { } protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule<ModuleA.ModuleAModule>(); moduleCatalog.AddModule<ModuleB.ModuleBModule>(); } } |
Строки с 1 по 14 являются автоматически сгенерированными частями шаблона Prism. Строки 16-21 определяют переопределенный метод для загрузки в приложение отдельных модулей.
Модуль, который вы хотите использовать в подобном приложении, загружается путем определения его в загрузчике, но не только как записать его в исходном коде, но и как использовать его в приложении. Также можно определить его в конфигурации или автоматически зарегистрировать модули, найденные путем поиска в указанном каталоге.
Учитывая фактическую работу, администратор считает, что метод размещения его в каталоге и автоматической регистрации является наиболее подходящим, но я не буду здесь объяснять. Если вы хотите загрузить модули в каталог и зарегистрировать их автоматически, пожалуйста, при необходимости обратитесь к «07-Modules – Directory» в официальном образце Prism.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<Window x:Class="UsingEventAggregator.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" Title="{Binding Title}" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <ContentControl prism:RegionManager.RegionName="LeftRegion" /> <ContentControl Grid.Column="1" prism:RegionManager.RegionName="RightRegion" /> </Grid> </Window> |
Строка 4 — это псевдоним для пространства имен XML для использования Prism в XAML. В строке 5 указывается, следует ли использовать ViewModelLocator для связи View с ViewModel.(Если установлено значение True, имя представления будет изменено на Views.Для MainWindowViewModel для которой вы установили значение DataContext, — это ViewModels.(Это будет MainWindowViewModel)
Если вы хотите изменить связь между View и ViewModel, см. Официальный пример » 9. ViewModelLocator – Change Convention» или “ViewModelLocator – Custom Registrations”
Строки 12 и 13 определяют название региона для модуля загрузки. Определенные здесь имена регионов также используются для создания модулей.
Это конфигурация оболочки, и мы продолжим рассказывать о том, как настроить модуль для загрузки в оболочку.
Что нужно указывать при инициализации модуля Prism
В примере есть 2 модуля, но основное содержание одно и то же, поэтому мы будем использовать ModuleA только в качестве примера. Модуль должен включать в себя класс, который наследуется от интерфейса IModule, и инициализировать сам модуль, и связать его с областью, размещенной в оболочке, и т.д.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ModuleAModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { var regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("LeftRegion", typeof(MessageView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { } } |
Это все, что вам нужно сделать для динамической загрузки частей пользовательского интерфейса в Prism, но в следующий раз эта статья будет посвящена фактическому созданию приложения.