ResourceDictionary в отдельной сборке

У меня есть файлы словаря ресурсов (MenuTemplate.xaml, ButtonTemplate.xaml и т. д.), Которые я хочу использовать в нескольких отдельных приложениях. Я мог бы добавить их в сборки приложений, но лучше, если я скомпилирую эти ресурсы в одну сборку, и мои приложения будут ссылаться на нее, верно?

Как я могу ссылаться на нее в App.xaml своих приложений после создания сборки ресурсов? В настоящее время я использую ResourceDictionary.MergedDictionaries для объединения отдельных файлов словарей. Если они есть в сборке, как я могу ссылаться на них в xaml?

Это может быть излишним, но вы можете подготовить свои ресурсы для экспорта, используя метод, описанный здесь: alexfeinberg.wordpress.com/2015/08/16/…. Основным преимуществом этого является предотвращение проблем с загрузкой нескольких версий сборки ресурсов в один и тот же домен приложения.

user195275 16.08.2015 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
251
1
142 411
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Проверьте синтаксис пакета URI. Вам нужно что-то вроде этого:

<ResourceDictionary Source = "pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

Что делать, если YourAssembly не содержится в пути приложения?

SaneDeveloper 26.08.2013 14:10

@Engineer Spock: тогда CLR не найдет его без помощи (ничего специально не связанного с WPF). Либо добавьте пробные пути к вашему app.config, либо прикрепите к AppDomain.AssemblyResolve, чтобы помочь ему найти сборку.

Kent Boogaart 26.08.2013 14:22

Нужно ли мне добавлять путь зондирования, если проект YourAssembly находится на том же уровне, что и проект приложения, которому необходимо ссылаться на YourAssembly? Например, C: \ Solution \ AppProject \ и C: \ Solution \ YourAssemblyProject \

SaneDeveloper 26.08.2013 14:40

@EngineerSpock: это отдельный вопрос, пожалуйста, откройте его.

Kent Boogaart 26.08.2013 14:52

Уже открыли stackoverflow.com/questions/18439516/…

SaneDeveloper 26.08.2013 15:18

Более конкретная ссылка на точный раздел, описывающий этот синтаксис: msdn.microsoft.com/en-us/library/…

Austin Mullins 01.08.2014 18:14

Этот ответ не имеет смысла. Чтобы следовать ему, нужно уже знать, как это делать!

user1040323 16.10.2018 18:20

Например, чтобы сделать это 15-секундным ответом -

Скажем, у вас есть "styles.xaml" в библиотеке WPF с именем "common", и вы хотите использовать его из своего основного проекта приложения:

  1. Добавить ссылку из основного проекта в «общий» проект
  2. Ваш app.xaml должен содержать:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source = "pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

А как же сделать ресурсы, определенные в styles.xaml, доступными через окно свойств Visual Studio 2010? Если я выберу элемент, а затем нажму «Применить ресурс» для его свойства Background, он покажет только SystemColors, а не те, которые определены в styles.xaml. Но если я сам ввожу имя ресурса в XAML, оно работает, поэтому на него правильно ссылаются.

xr280xr 13.05.2013 22:42

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

Andrejs Gasilovs 12.06.2017 12:31

Я работаю с .NET 4.5 и не могу заставить это работать ... Я использовал WPF Custom Control Library. В конце концов, это сработало для меня ...

<ResourceDictionary Source = "/MyAssembly;component/mytheme.xaml" />

источник:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19

DLL только для ресурсов - это вариант для вас. Но это не обязательно, если вы не хотите изменять ресурсы без перекомпиляции приложений. Также можно использовать только один общий файл ResourceDictionary. Это зависит от того, как часто вы меняете ресурсы и т. д.

<ResourceDictionary Source = "pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

Моя сборка - просто имя сборки без расширения

ПапкаСтруктураInAssembly - если ваши ресурсы находятся в папке, укажите структуру папок

Когда вы делаете это, лучше также знать о siteOfOrigin.

WPF supports two authorities: application:/// and siteoforigin:///. The application:/// authority identifies application data files that are known at compile time, including resource and content files. The siteoforigin:/// authority identifies site of origin files. The scope of each authority is shown in the following figure.

Использование XAML:

Если вы знаете другую структуру assembly и хотите, чтобы resources был в коде C#, используйте следующий код:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

Выход: Если мы хотим использовать ResourceDictionaryRD1.xaml проекта WpfControlLibrary1 в проекте StackOverflowApp.

Структура проектов:

Structure of Projects

Словарь ресурсов:Resource Dictionary

Вывод кода:

Output

PS: Все файлы ResourceDictionary должны иметь Build Action как «Resource» или «Page».

Используя C#:

If anyone wants the solution in purely c# code then see my this solution.

Для UWP:

<ResourceDictionary Source = "ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

Другие вопросы по теме