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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Приветствия

Ответ 4

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

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

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

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

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

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

enter image description here

Ответ 5

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

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

 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.

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

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

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

Выход кода:

Вывод

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

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

Если кто-то хочет решение в чисто С# code, тогда посмотрите на мой этот Решение.

Ответ 6

Для UWP:

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