Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На этот раз в результате щелчка на кнопке Cancel цвет фона для кнопки Cancel изменяется, а цвет фона для кнопки ОК остается прежним. Причина в том, что расширение разметки
{DynamicResource}
{StaticResource}
Ресурсы уровня приложения
Когда в словаре ресурсов окна имеются объектные ресурсы, их могут потреблять все элементы этого окна, но не другие окна приложения. Решение совместно использовать объектные ресурсы в рамках приложения предусматривает их определение на уровне приложения, а не на уровне какого-то окна. В Visual Studio отсутствуют способы автоматизации такого действия, а потому необходимо просто вырезать имеющееся определение объекта кисти из области
Windows.Resource
Application.Resources
Арр.xaml
Теперь любое дополнительное окно или элемент управления в приложении в состоянии работать с данным объектом кисти. Ресурсы уровня приложения доступны для выбора при установке свойства
Background

На заметку! Помещение ресурса на уровень приложения и назначение его свойству элемента управления приводит к замораживанию ресурса, что препятствует изменению значений во время выполнения. Ресурс можно клонировать и модифицировать клон.
Определение объединенных словарей ресурсов
Ресурсов уровня приложения часто оказывается вполне достаточно, но они ничем не помогут, если ресурсы необходимо разделять между проектами. В таком случае понадобится определить то, что известно как объединенный словарь ресурсов. Считайте его библиотекой классов для ресурсов WPF; он представляет собой всего лишь файл
.xaml

Вырежьте текущие ресурсы из области определения
Application.Resources
МуBrushes.xaml
<ResourceDictionary xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:local="clr-namespace:ObjectResourcesApp"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="#FFC44EC4" Offset="0" />
<GradientStop Color="#FF829CEB" Offset="1" />
<GradientStop Color="#FF793879" Offset="0.669" />
</RadialGradientBrush>
</ResourceDictionary>
Хотя данный словарь ресурсов является частью проекта, все словари ресурсов должны быть объединены (обычно на уровне приложения) в единый словарь ресурсов, чтобы их можно было использовать. Для этого применяется следующий формат в файле
Арр.xaml
ResourceDictionary
ResourceDictionary.MergedDictionaries
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyBrushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Проблема такого подхода в том, что каждый файл ресурсов потребуется добавлять в каждый проект, нуждающийся в ресурсах. Более удачный подход к разделению ресурсов заключается в определении библиотеки классов .NET Core для совместного использования проектами, чем мы и займемся.
Определение сборки, включающей только ресурсы
Самый легкий способ построения сборки из одних ресурсов предусматривает создание проекта WPF User Control Library (.NET Core) (Библиотека пользовательских элементов управления WPF (.NETCore)). Создайте такой проект (по имени
MyBrushesLibrary
ObjectResourcesApp
Теперь удалите файл
UserControll.xaml
MyBrushes.xaml
MyBrushesLibrary
ObjectResourcesApp
MyBrushes.xaml
MyBrushesLibrary
х:local
clr-namespace:MyBrushesLibrary
MyBrushes.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyBrushesLibrary">
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="#FFC44EC4" Offset="0" />