WPF Prism - Где разместить ресурсы?
У меня есть приложение призмы и различные модули. Мне интересно, где лучше всего найти ресурсы, такие как стили, кисти, контрольные шаблоны, datatemplates?
Должен ли я сделать один единственный ресурсный словарь и все там положить? Должен ли каждый модуль иметь собственные ресурсы? Или каждый взгляд? Я хотел бы следовать цели Prism, чтобы держать все модульным, но также я не вижу смысла повторно объявлять одни и те же ресурсы в каждом модуле...
Ответы
Ответ 1
Я разрабатываю приложение с Prism, и я использую технику, очень близкую к описанию в руководстве Prism. Существует проект YourApplication.Infrastructure, где вы обычно размещаете все свои общие интерфейсы и т.д. Итак:
- Я просто добавляю проект YourApplication.Resources
- Создать папку Темы
- Создайте отдельный файл xaml в папке "Темы" для каждой группы ресурсов (например, Generic.WPF.xaml для стандартных стилей управления WPF, Generic.Brushes.xaml для кистей и т.д.).
-
Создайте файл Themes\Generic.xaml(именно с этим именем он добавит огромные преимущества в будущем) с контентом, например
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Generic.Brushes.xaml"/>
<ResourceDictionary Source="Generic.WPF.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
-
Теперь вы можете добавить эти ресурсы в любой модуль (у вас есть отдельный проект для этого, верно?), добавив ссылку на YourApplication.Resources в этот проект и добавив к вашему представлению xaml:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- Put your not shared resource here -->
</ResourceDictionary>
</UserControl.Resources>
Я не знаю, может быть, у этого пути есть некоторые проблемы, но он работает и хорошо работает для меня. Если кто-нибудь может так или иначе прокомментировать (плюсы/минусы) - я буду очень рад это услышать!
Ответ 2
Ресурсы, используемые в приложении, я обычно помещаю в ResourceDictionary
, который добавляется к App.xaml
или StartupWindow.xaml
Ресурсы для определенного вида обычно расположены вместе с представлением. Например, UserControl, который используется для CalendarView, будет содержать любые настраиваемые ресурсы для Календаря, такие как кисти, связанные с календарем, стили, шаблоны и т.д.
Обычно я не вижу причины создавать ресурсы для всего модуля, но если я когда-либо сделаю, у меня будет ResourceDictionary
для модуля, который может быть загружен в объединенные словари приложения во время выполнения или включен в индивидуальные Представления в модуле.
Ответ 3
Я хотел бы поделиться некоторыми новыми знаниями. Я использую подход @chopikadze. И это действительно классный подход. Благодаря вам!
Однако, если вы не хотите писать каждый раз для каждого элемента управления эти фрагменты кода:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- Put your not shared resource here -->
</ResourceDictionary>
</UserControl.Resources>
Тогда вы можете просто объявить <ResourceDictionary/>
в App.xaml
вашего Bootstrapper
следующим образом:
<Application.Resources>
<ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/>
</Application.Resources>