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





Проверьте синтаксис пакета URI. Вам нужно что-то вроде этого:
<ResourceDictionary Source = "pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Что делать, если YourAssembly не содержится в пути приложения?
@Engineer Spock: тогда CLR не найдет его без помощи (ничего специально не связанного с WPF). Либо добавьте пробные пути к вашему app.config, либо прикрепите к AppDomain.AssemblyResolve, чтобы помочь ему найти сборку.
Нужно ли мне добавлять путь зондирования, если проект YourAssembly находится на том же уровне, что и проект приложения, которому необходимо ссылаться на YourAssembly? Например, C: \ Solution \ AppProject \ и C: \ Solution \ YourAssemblyProject \
@EngineerSpock: это отдельный вопрос, пожалуйста, откройте его.
Уже открыли stackoverflow.com/questions/18439516/…
Более конкретная ссылка на точный раздел, описывающий этот синтаксис: msdn.microsoft.com/en-us/library/…
Этот ответ не имеет смысла. Чтобы следовать ему, нужно уже знать, как это делать!
Например, чтобы сделать это 15-секундным ответом -
Скажем, у вас есть "styles.xaml" в библиотеке WPF с именем "common", и вы хотите использовать его из своего основного проекта приложения:
<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, оно работает, поэтому на него правильно ссылаются.
Просто хотел добавить, что если вы ссылаетесь на ResourceDictionary из UserControl, вам нужно добавить ссылку на сборку в обоих местах: в UserControl и в проекте главного окна. В противном случае вы получите ошибку времени выполнения.
Я работаю с .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.
Структура проектов:
Вывод кода:
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" />
Это может быть излишним, но вы можете подготовить свои ресурсы для экспорта, используя метод, описанный здесь: alexfeinberg.wordpress.com/2015/08/16/…. Основным преимуществом этого является предотвращение проблем с загрузкой нескольких версий сборки ресурсов в один и тот же домен приложения.