Nano Hash - криптовалюты, майнинг, программирование

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

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

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

21.12.2011

Ответы:


1

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

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

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

21.12.2011
  • Привет, знаю, что это немного устарело, но нужно прокомментировать это и спросить совет, связанный с этим. Я сделал то же самое и пробовал разные простые или расширенные имена. Имена и адреса кажутся правильными. Должны ли мы что-либо зарегистрировать в контейнере или выполнить какие-либо методы инициализации, чтобы использовать этот подход. Мне кажется, не удалось найти сборку ресурсов во время выполнения? Prism 4.1, спасибо. 04.11.2012
  • @Sypress на самом деле этот метод не использует ничего из Prism, он просто похож на Prism. Он использует только встроенные функции WPF и XAML. Как именно написано, что не удалось найти? Выдает ошибку или просто не использует стиль из сборки (возможно - стиль по умолчанию)? 05.11.2012
  • Не удалось найти сборку, я прошел сборку через ms-build и проблема исчезла :) 08.11.2012
  • Все еще действует в 2020 году 14.10.2020

  • 2

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

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

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

    21.12.2011

    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>
    
    24.02.2016
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..