WPF Prism - Где разместить ресурсы? - PullRequest
16 голосов
/ 21 декабря 2011

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

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

Ответы [ 3 ]

31 голосов
/ 21 декабря 2011

Я разрабатываю приложение с помощью Prism и использую технику, очень близкую к описанной в руководстве Prism.Есть проект YourApplication.Infrastructure, где вы обычно размещаете все свои общие интерфейсы и т. Д. Итак:

  1. Я просто добавляю проект YourApplication.Resources
  2. Создайте там папку Themes
  3. Создайте отдельный файл xaml в папке «Темы» для каждой группы ресурсов (например, Generic.WPF.xaml для стандартных стилей элементов управления WPF, Generic.Brushes.xaml для кистей и т. Д.)
  4. Создать файл Темы \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>
    
  5. Теперь вы можете добавить эти ресурсы в любой модуль (у вас есть отдельный проектдля этого, верно?) добавив ссылку на 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>
    

Не знаю, возможно, у этого способа есть некоторые проблемы, но это работает, и работает хорошо для меня.Если кто-то может так прокомментировать (плюсы / минусы) - я буду очень рад это услышать!

5 голосов
/ 21 декабря 2011

Ресурсы всего приложения, которые я обычно помещаю в ResourceDictionary, который добавляется к App.xaml или StartupWindow.xaml

Ресурсы для определенного вида обычно располагаются вместе с видом. Например, UserControl, который используется для CalendarView, будет содержать любые пользовательские ресурсы для Календаря, такие как кисти, стили, шаблоны и т. Д. Для календаря

Обычно я не вижу смысла делать ресурсы для всего модуля, но если я когда-либо это сделаю, у меня будет ResourceDictionary для модуля, который можно загрузить в объединенные словари приложения во время выполнения или включить в отдельный Просмотры в модуле.

3 голосов
/ 24 февраля 2016

Я хотел бы поделиться некоторыми новыми знаниями. Я использую подход @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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...