ResourceDictionary в отдельной сборке - PullRequest
231 голосов
/ 03 декабря 2008

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

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

Ответы [ 6 ]

336 голосов
/ 03 декабря 2008

Проверьте синтаксис pack URI . Вы хотите что-то вроде этого:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
91 голосов
/ 27 марта 2010

Пример, просто чтобы ответить на этот вопрос за 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>

Приветствия

33 голосов
/ 18 апреля 2012

Я работаю с .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

16 голосов
/ 30 марта 2013

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

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

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

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

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

WPF поддерживает два органа: application: /// и siteoforigin: ///. Приложение: /// полномочия идентифицируют файлы данных приложения, которые известны во время компиляции, включая файлы ресурсов и содержимого. siteoforigin: /// орган власти идентифицирует файлы сайта происхождения. Сфера каждого авторитета показан на следующем рисунке.

enter image description here

7 голосов
/ 27 апреля 2017

Для UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
4 голосов
/ 15 апреля 2016

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

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

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

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

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

Structure of Projects

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

Кодовый вывод:

Output

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

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

Если кому-то нужно решение в чисто c # коде , тогда посмотрите мой этот решение.

...