Для полного понимания изложенного ниже материала рекомендуется ознакомиться с содержанием статьи Создание пустого модуля

Итак, начнем.

Службы — это компоненты, которые инкапсулируют связанную не UI функциональность, такую как журналирование, управление исключением, и доступ к данным. Службы часто регистрируются в контейнере внедрения зависимости так, чтобы они могли быть обнаружены или созданы при надобности и использоваться другими компонентами, которые зависят от них. В качестве примера можно рассмотреть службу IUsersService из статьи Создание пустого модуля.

Службы, предоставляемые модулем, рекомендуется регистрировать в едином месте, а именно в классе, наследующим класс ModuleBase. При необходимости зарегестрировать службы, в модуле должна быть перегружена функция RegisterServices().

Например, для регистрации службы, позволяющей оперировать местами хранения на складе, код будет выглядеть следующим образом:

protected override void RegisterServices()
{
base.RegisterServices();
UnityContainer.RegisterInstance<IStoragePlaceService>(
new StoragePlaceService(),
new ContainerControlledLifetimeManager());
}

Как видно из примера, мы регистрируем единственную службу (а точнее – единственный экземпляр службы) StoragePlaceService, которая реализует интерфейс IStoragePlaceService. После этого, указанную службу можно будет использовать в любом месте своей программы.

О том, как регистрировать службы и использовать контейнер, можно подробно почитать в руководстве к библиотеке PRISM (полный перевод руководства на русский доступен на ресурсе habrahabr.ru).

Теперь разберемся с тем, как добавлять элементы в главное меню приложения.

Рассмотрим следующий сценарий: у нас имеется представление, позволяющее редактировать места хранения на складе и мы хотим, чтобы к ней был доступ из главного меню нашего приложения.

Для этих целей в нашей оболочке предусмотрена служба главного меню: IMainMenuService (доступ к ней можно получить используя свойство MainMenuService базового класса ModuleBase). Для добавления элементов главного меню следует перегрузить функцию RegisterMenuItems() базового класса ModuleBase и поместить туда следующий код (для примера):

protected override void RegisterMenuItems()
{
base.RegisterMenuItems();
var icons = new ResourceDictionary { Source = new Uri("/ModernStore.DirectoriesModule;component/Resources/Images.xaml", UriKind.RelativeOrAbsolute) };
MainMenuService.Add(new MainMenuElement
{
Title = "Места хранения",
GroupName = DirGroupName,
IconData = icons[IconNames.StoragePlaceIcon] as Geometry,
Command = new RelayCommand(() => DocumentManager.NavigateTo<StoragePlacePresenter>())
});
}

Разберем этот код.

Первым шагом мы получаем справочник с иконками, которые используются в нашем модуле (переменная icons). Для примера можно использовать следующий справочник:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resources="clr-namespace:ModernStore.DirectoriesModule.Resources">
<PathGeometry x:Key="{x:Static resources:IconNames.StoragePlaceIcon}">F1 M 23,19L 53,19L 56.9999,25.0001L 57,27L 19,27L 19,25.0001L 23,19 Z M 19,42L 19,29L 57,29L 57,42L 19,42 Z M 34,33L 34,35L 42,35L 42,33L 34,33 Z M 19,57L 19,44L 56.9999,44L 57,57L 19,57 Z M 34,48L 34,50L 42,50L 42,48L 34,48 Z</PathGeometry>
</ResourceDictionary>

Затем мы создаем и добавляем новый пункт меню, прикрепляя к нему команду для навигации к представлению, о котором мы упоминали выше.
Примечание. DocumentManager – класс, позволяющий производить навигацию по представлениям. Его метод NavigateTo<> позволяет осуществить навигацию к представлению, закрепленному за указанным презентером. Более подробно о навигации будет изложено в следующих уроках. А пока, при запуске приложения мы можем любоваться красивой картинкой Улыбка
MenuSample

Last edited Jan 27, 2014 at 1:41 PM by Maxxtor, version 13