WPF Prism - Где разместить ресурсы? - программирование
Подтвердить что ты не робот

WPF Prism - Где разместить ресурсы?

У меня есть приложение призмы и различные модули. Мне интересно, где лучше всего найти ресурсы, такие как стили, кисти, контрольные шаблоны, datatemplates?

Должен ли я сделать один единственный ресурсный словарь и все там положить? Должен ли каждый модуль иметь собственные ресурсы? Или каждый взгляд? Я хотел бы следовать цели Prism, чтобы держать все модульным, но также я не вижу смысла повторно объявлять одни и те же ресурсы в каждом модуле...

4b9b3361

Ответ 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>